mysql - 解密 MySQL 编码

标签 mysql unicode encoding utf-8 internationalization

我在 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”代表Y).基本上,它采用两个十六进制值并将它们显示为 UTF8 字符。

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

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

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

非常感谢任何见解。

最佳答案

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

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

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

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

本质上,这些是可能会搞砸的点:

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

希望对您有所帮助。

关于mysql - 解密 MySQL 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8308060/

相关文章:

javascript - 在 IE8 中使用 "Save As"execCommand 以 ANSI 格式而不是 UCS2-Little Endian 格式保存 XML 文件

swift - 为什么像 👩‍👩‍👧‍👦 这样的表情符号字符在 Swift 字符串中处理得如此奇怪?

c++ - unicode 字符值

java - 如何使用 JavaMailSenderImpl 发送 UTF-8 编码的电子邮件正文?

Php Login/Mysql 检查 mysql 不适用于 SHA512

c++ - Windows 上的 Unicode 基础知识

php - MySQL导入汉字

php - 在执行基本 SELECT 操作时,您的 SQL 语法有错误

MySQL:构建一个 View ,其中的列的数据依赖于另一个 View

php - 拥有非常简单的CMS系统