数据存储和访问

本主题专门讨论了 UTF-8 以及将其与数据库一起使用的注意事项。如果你想了解有关在 PHP 中使用数据库的更多信息,请查看此主题

在 MySQL 数据库中存储数据:

  • 在数据库的所有表和文本列上指定 utf8mb4 字符集。这使得 MySQL 物理存储和检索以 UTF-8 本地编码的值。

    如果指定了 utf8mb4_*排序规则,MySQL 将隐式使用 utf8mb4 编码(没有任何显式字符集)。

  • 较旧版本的 MySQL(<5.5.3)不支持 utf8mb4,因此你将被迫使用 utf8,它仅支持 Unicode 字符的子集。

访问 MySQL 数据库中的数据:

  • 在你的应用程序代码(例如 PHP)中,无论你使用何种数据库访问方法,都需要将连接字符集设置为 utf8mb4。这样,当 MySQL 将数据移交给你的应用程序时,MySQL 不会从其原生 UTF-8 进行转换,反之亦然。

  • 一些驱动程序提供了自己的配置连接字符集的机制,它们都更新自己的内部状态,并通知 MySQL 要在连接上使用的编码。这通常是首选方法。

    例如(关于 utf8mb4 / utf8 的相同考虑如上所述):

    • 如果你使用 PHP≥5.3.6 的 PDO 抽象层,则可以在 DSN 中指定 charset

      $handle = new PDO('mysql:charset=utf8mb4');
      
    • 如果你使用的是 mysqli ,可以拨打 set_charset()

      $conn = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
      
      $conn->set_charset('utf8mb4');        // object oriented style
      mysqli_set_charset($conn, 'utf8mb4'); // procedural style
      
    • 如果你遇到普通的 mysql 但碰巧运行 PHP≥5.2.3 ,则可以调用 mysql_set_charset

      $conn = mysql_connect('localhost', 'my_user', 'my_password');
      
      $conn->set_charset('utf8mb4');       // object oriented style
      mysql_set_charset($conn, 'utf8mb4'); // procedural style
      
    • 如果数据库驱动程序没有提供自己的设置连接字符集的机制,则可能必须发出一个查询来告诉 MySQL 应用程序如何期望对连接上的数据进行编码: SET NAMES 'utf8mb4'