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