有趣的问题...如果我有一个 CHARSET=utf8 的 MySQL 表,并且我打开一个使用 latin1 编码的连接,会发生什么?
我试过了,甚至可以正确存储和检索诸如 ß 和 æ 之类的字符。这些字符在 utf8 和 latin1 中用不同的字节序列表示,所以我没想到它会起作用。
MySQL 是否在字符编码之间进行某种即时翻译?
在您连接另一个连接字符集之前,您会觉得它有效。然后你会看到奇怪的字符,肯定会后悔。
您在数据库中存储的字节只有在您使用 utf8 转换读取它们时才有意义。但是您告诉mysql该字段是拉丁语,所以他不会理解,但无论如何他都会将它们发送给您(您是人类,他会服从)。当您与 utf8 连接时,您将通过此字符集阅读它们并正常阅读。
但是,如果连接更改了字符集,或者您稍后尝试更改字段的字符集,您将遇到麻烦,并且需要像这样的技巧来读取单个字段内容:
convert(cast(convert(FieldNameMessed using latin1) as binary) using utf8)
是的,mysql 确实会进行 chrset 转换,具体取决于配置。要更改连接的 chrset,您可以使用SET NAMES
SET NAMES utf8;