数据存储和访问
本主题专门讨论了 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'。 
 -