Mysql 碰巧将这三个字节解释为UTF8。(但是,这是一种推测。我不完全确定“无意中正确”的转换发生在哪一点。)

Mysql 碰巧将这三个字节解释为UTF8。(但是,这是一种推测。我不完全确定“无意中正确”的转换发生在哪一点。),mysql,character-encoding,Mysql,Character Encoding,当然,MySQL会以类似但相反的方式处理拉丁语99。也值得一看HEX(lat)和HEX(utf)返回的内容。可能相关:状态的输出,显示创建表chrs和显示创建数据库YOURDB。有趣的信息,但是终端软件设置了UTF-8作为远程字符集,我认为这会有所不同。它也会一直被错误地显示吗?我仍然可以通过选择BINARY使其正确显示。我遗漏的另一个有趣的事实是,“TM”显示正确,而空间不适合某些客户机。此答案也不能解释您尝试插入U+00a0时的存储行为?只是好奇。看起来最容易混淆的事情是将所有列都变成二进制

当然,MySQL会以类似但相反的方式处理拉丁语
99

也值得一看
HEX(lat)
HEX(utf)
返回的内容。可能相关:状态的输出
显示创建表chrs
显示创建数据库YOURDB。有趣的信息,但是终端软件设置了UTF-8作为远程字符集,我认为这会有所不同。它也会一直被错误地显示吗?我仍然可以通过选择
BINARY
使其正确显示。我遗漏的另一个有趣的事实是,“TM”显示正确,而空间不适合某些客户机。此答案也不能解释您尝试插入
U+00a0
时的存储行为?只是好奇。看起来最容易混淆的事情是将所有列都变成二进制,并让客户机负责转换。@ExplosionPills使用正确的字符编码,允许MySQL对字段进行正确排序和比较。对于大多数字符类型字段,匹配需要不区分大小写地进行——而不是在二进制字段上高效地完成。在许多情况下,用户会期望看到排序以特定的方式进行,这可能与原始二进制排序不同。我认为排序/比较与排序规则有关,而不是与字符集有关all@ExplosionPills这也是使用正确字符集的主要原因。对于大多数应用程序,无论实际使用的字符集是什么,都可以通过拉丁1连接使用拉丁1字段。但是,它搞砸了你的分类。如果一个客户机连接非常好,可以告诉服务器它是一个utf8客户机,它会看到mush。@ExplosionPills我还没有完全研究过它,但是二进制排序规则与非二进制排序规则的效果不同。()
CREATE TABLE chrs (
    lat varchar(255) charset latin1,
    utf varchar(255) charset utf8
);
INSERT INTO chrs VALUES ('™', '™');
INSERT INTO chrs VALUES (' ', ' '); -- U+00a0
> SELECT * FROM chrs;
+------+------+
| lat  | utf  |
+------+------+
| ™    | ™    |
|      |      |
+------+------+
 > SELECT BINARY lat, BINARY utf FROM chrs;
+------------+------------+
| BINARY lat | BINARY utf |
+------------+------------+
| �           | ™          |
| �           |            |
+------------+------------+
|     |     |
E284A2
99
mysql> select *, hex(lat), hex(utf) from chrs;
+------+------+----------+----------------+
| lat  | utf  | hex(lat) | hex(utf)       |
+------+------+----------+----------------+
| ™  | ™  | E284A2   | C3A2E2809EC2A2 |
|      |      | 20       | 20             |
| ?    | ?    | 99       | E284A2         |
|      |      | 20       | 20             |
+------+------+----------+----------------+
mysql> select *, hex(lat), hex(utf) from chrs;
+---------+---------+----------+----------------+
| lat     | utf     | hex(lat) | hex(utf)       |
+---------+---------+----------+----------------+
| â„¢     | â„¢     | E284A2   | C3A2E2809EC2A2 |
|         |         | 20       | 20             |
| ™       | ™       | 99       | E284A2         |
|         |         | 20       | 20             |
+---------+---------+----------+----------------+