【问题标题】:How do I insert UCS-2 data with PHP PDO into MySQL?如何将带有 PHP PDO 的 UCS-2 数据插入 MySQL?
【发布时间】:2011-08-28 22:18:29
【问题描述】:

manual 明确指出“ucs2 不能用作客户端字符集,这意味着它不适用于 SET NAMES 或 SET CHARACTER SET”。那么如何插入代码点 U+2193 之类的呢?我正在使用 PHP 5.3 + PDO。

【问题讨论】:

  • 您可能可以摆脱使用 UTF-16。大部分代码点都是一样的。
  • 改用 UTF-8 怎么样?

标签: php mysql unicode pdo


【解决方案1】:

如果您想使用 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 的 utf8ucs2 字符集仅涵盖称为基本多语言平面 (BMP) 的 Unicode 子集。 Unicode 字符集的世界是 expanded in MySQL 5.5 以超越 BMP,但您仍然不能使用 ucs2、新的 utf16utf32 字符集作为客户端字符集,让您仍然坚持使用 UTF-8。

【讨论】:

  • 好吧,好吧,但是如果你不能使用 MySQL,为什么还要有一个 ucs2 字符集(和排序规则)呢??
  • 如果您有合理的理由(可能是大块 CJK?),您可以使用这些编码存储数据。您只是不能让数据库服务器和客户端在其中相互交谈。客户端-服务器链接使用什么编码并不重要,只要双方都同意并且它涵盖了应用程序想要的所有字符(UTF 总是会这样)。
  • UTF-16 在很多 *ix 世界中都算是二等公民,包括 MySQL 和 PHP。你确定你真的有 PHP 中的 UTF-16/UCS-2 数据吗?它提供了一些工具来有效地处理这种编码中的字节字符串。您更有可能使用更合理的编码 UTF-8。
【解决方案2】:

为了后代,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。
猜你喜欢
  • 2018-02-18
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 2013-07-27
  • 2011-09-19
相关资源
最近更新 更多