【发布时间】:2011-08-28 22:18:29
【问题描述】:
manual 明确指出“ucs2 不能用作客户端字符集,这意味着它不适用于 SET NAMES 或 SET CHARACTER SET”。那么如何插入代码点 U+2193 之类的呢?我正在使用 PHP 5.3 + PDO。
【问题讨论】:
-
您可能可以摆脱使用 UTF-16。大部分代码点都是一样的。
-
改用 UTF-8 怎么样?
manual 明确指出“ucs2 不能用作客户端字符集,这意味着它不适用于 SET NAMES 或 SET CHARACTER SET”。那么如何插入代码点 U+2193 之类的呢?我正在使用 PHP 5.3 + PDO。
【问题讨论】:
如果您想使用 Unicode 与 MySQL 服务器通信,您唯一的选择是使用 UTF-8。
如果您现在在 PHP 中使用 UCS-2 或 UTF-16 字符串,则必须在尝试存储它们之前将它们转换为 UTF-8。另请注意,如果您将客户端字符集设置为,MySQL 将返回 UTF-8,因此如果您致力于在 PHP 端使用 UCS-2,您还需要转换查询结果。 (如果您能够进行更大的更改,那么在所有地方都使用 UTF-8 可能会比进行所有这些额外的转换更好。)
至于存储代码点 U+2193,不用担心:UTF-8 可以表示每个 Unicode 代码点(在这种特定情况下,它应该是 0xE2 0x86 0x93)。
从技术上讲,这有点捏造,因为 MySQL 的 utf8 和 ucs2 字符集仅涵盖称为基本多语言平面 (BMP) 的 Unicode 子集。 Unicode 字符集的世界是 expanded in MySQL 5.5 以超越 BMP,但您仍然不能使用 ucs2、新的 utf16 或 utf32 字符集作为客户端字符集,让您仍然坚持使用 UTF-8。
【讨论】:
为了后代,CREATE TABLE test (encoding varchar(255) CHARACTER SET ucs2); 然后INSERT INTO test VALUES (1, CHAR(0x2193));。如果我随后运行SELECT * FROM test,我会看到一个向下箭头。
【讨论】:
character_set_results 设置为二进制或 ucs2,否则 MySQL 会自动将您的结果转换为另一种编码,即使它们存储为 UCS-2。