【问题标题】:Deciphering MySQL Encoding解密 MySQL 编码
【发布时间】:2011-11-29 08:57:41
【问题描述】:

我在 MySQL 中遇到编码问题,我需要一些帮助来弄清楚发生了什么。

首先,一些参数。表的默认编码是 utf8。但是,character_set_client、character_set_connection、collat​​ion_connection 和 character_set_server MySQL 系统变量都是 latin1。

我通过 ssh 连接到我的 MySQL 服务器并使用本地命令行客户端连接到本地服务器。我选择记录/列和返回的字符串,假设字符返回为 A,这是正确的。 A 在 UTF-8 中用十六进制表示为“C5 9F”。

但是,访问服务器的 PHP 应用程序将其解释为 XY。在 MySQL 命令行客户端中,如果我发送命令“SET NAMES utf8”,它现在也会显示为 XY。

如果我选择 INTO OUTFILE 并使用 hexedit 编辑文件,我会看到两个映射到 X 的十六进制字符,然后是两个映射到 Y 的十六进制字符。(“c3 85”表示 X,“C5 B8”表示是)。基本上,它采用两个十六进制值并将它们显示为 UTF8 字符。

首先,看起来数据库确实将内容存储为 UTF8,但 UTF8 类型错误,对吗?它们是作为原始 Unicode 输入的,但不知何故,可能是因为系统变量,它没有被转换为 UTF8?

其次,MySQL 命令行客户端如何/为什么将 XY 正确解释为 A?

最后,对于MySQL命令行的成功解读,是否有图表显示C3 85 C5 B8是如何转换为A,或者XY是如何转换为A的?

非常感谢您提供任何见解。

【问题讨论】:

    标签: mysql unicode encoding utf-8 internationalization


    【解决方案1】:

    你的问题有点令人困惑,所以我会用我自己的例子来解释:

    您连接到数据库没有发出SET NAMES,因此连接设置为Latin-1。这意味着数据库预计您与它之间的任何通信都以 Latin-1 编码。
    您将字节 C3A2 发送到数据库,您希望在 UTF-8 编码中表示“â”。
    期望 Latin-1 的数据库将其解释为字符“¢”(Latin-1 编码中的C3 和A2)。
    数据库将在内部以表格设置的任何编码存储这两个字符。

    您以不同的方式连接到数据库,运行SET NAMES UTF-8。数据库现在希望以 UTF-8 与您对话。
    您查询存储在数据库中的数据,收到以 UTF-8 编码为 C382 C2A2 的字符“¢”,因为您告诉数据库存储 字符“¢”,而您是现在通过 UTF-8 连接查询它们。

    如果您再次使用 Latin-1 连接到数据库,数据库将为您提供以 Latin-1 编码的字符“¢”,即字节 C3 A2。如果您用来连接的客户端使用 Latin-1 进行解释,您将看到字符“¢”。如果客户端将其解释为 UTF-8,您将看到字符“â”。

    基本上这些是可能搞砸的点:

    • 数据库会将其接收到的任何 bytes 解释为为连接设置的任何编码中的 characters,并转换这些字符的编码以匹配它们应该使用的表存放在
    • 数据库将在检索数据时将任何字符的编码从它们存储的编码转换为连接的编码
    • 客户端可能会将其从数据库接收的 字节 解释为正确的字符以在屏幕上显示,尤其是命令行环境并不总是设置为正确显示 UTF-8 数据

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-07-04
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      相关资源
      最近更新 更多