我一直在寻找几个小时来寻找这个答案,但似乎还没有涵盖。我会尽量简洁。
我有一个客户端运行一个有一些字符编码问题的网络应用程序。规格:
- CentOS 6.3
- MySQL 服务器 5.1.67
- 所有表都设置为 UTF-8
- SHOW FULL COLUMNS 还验证每个表中的所有文本列都是 UTF-8
- 进入数据库的数据是 UTF-8
- 数据以 UTF-8 格式提供给 Web 客户端
- 输出数据中没有坏字符;强制浏览器使用 Latin1 会导致各种问题
所以,基本上,一切都是 UTF-8,一切都运行良好。
除了...与 MySQL 的所有连接都必须是 Latin1,否则整个系统就会崩溃。我已经用控制台 MySQL 客户端、PHP/Mysql、PHP/Mysqli 和 Ruby mysql gem v2.8.1 验证了这一点。发出“SET NAMES utf8”之类的命令或使用各种 API 方法将连接字符集更改为 UTF-8 会导致所有多字节字符变为乱码且无法识别。
目前这里没有什么大问题,当然除了在我的 Ubuntu 测试环境中使用 Latin1 连接到服务器根本不起作用,所以当我将它们投入生产时,我的程序会不断中断。但我有一种挥之不去的感觉,有些事情不可能是对的,以后它会回来咬我的客户。
MySQL 在初始连接到服务器时报告此问题:
character_set_client: latin1
character_set_connection: latin1
character_set_database: latin1
character_set_filesystem: binary
character_set_results: latin1
character_set_server: latin1
character_set_system: utf8
这些是适用于 UTF-8 数据的设置。如果我将其他任何内容更改为 UTF-8,多字节字符就会惨死。
如果有人知道这里出了什么问题以及我可以在哪里找到更好的文档,那将不胜感激。