MYSQL数据库编码,混合了latin1和utf-8

时间:2018-06-02 02:33:16

标签: mysql utf-8 character-encoding utf8mb4

我有一个较旧的MYSQL 5.6.34数据库,它是几年前创建的(不是我)。当我注意到其他一些表格有latin1编码时,我已经从其中一个数据库中开始构建表格,以便在我的应用程序中使用。然后我注意到了所有数据库,information_schema全部使用latin1除外。

SCHEMA_NAME         DEFAULT_CHARACTER_SET_NAME  DEFAULT_COLLATION_NAME
information_schema  utf8                        utf8_general_ci
443347_pxa          latin1                      latin1_swedish_ci
443348_srp          latin1                      latin1_swedish_ci
warehouseinventory  latin1                      latin1_swedish_ci

我不确定为什么原始开发者使用latin1进行编码和整理。真的没有理由。

我真的不想更改任何现有数据库的任何编码,我只想用utf8mb4创建新表。但是我想的越多,为了保持一致,我可能想要改变它们。我创建的最后一个数据库是warehouseinventory,但我没有注意到编码,我认为它基于先前创建的数据库的编码默认为latin1

我有什么理由将这些留在latin1并且更改它们会有什么影响吗?其中一个数据库确实存有西班牙语,但我一直认为这只是UTF。

1 个答案:

答案 0 :(得分:2)

如果您对声明为VARCHAR(255)的列有任何索引,则可能会收到大于767字节的索引错误"转换为utf8mb4时。有5 workarounds

如果您没有索引的191到255个字符之间的任何变体,那么

ALTER TABLE tbl CONVERT TO utf8mb4;

会将表格tbl中的所有列转换为utf8mb4。

如果您在"双重编码"中碰巧将utf8字节错误地存储到latin1中,则需要另外修复。查看Fixes for various Cases

"默认"字符集或整理只是 - 默认情况下。也就是说,当创建新列或表时,它将采用默认。如果为列显式指定charset和/或collat​​ion,则会覆盖表的默认值。

有一句老话:"如果它没有破坏,就不要修理它。"我倾向于制作新的数据库/表/列utf8mb4,但只留下旧的数据库/表/列。注意:混合物没问题。 连接指定客户端使用的编码。在INSERTSELECT期间,MySQL会将/从客户端的设置转换为/从列的设置转换。

西班牙语有一组有限的字符。该集是latin1,utf8和utf8mb4的子集,因此任何这些字符集都与西班牙语一起使用。但是,编码是不同的。例如,ñ

Hex F1   in latin1
Hex C3B1 in utf8 and utf8mb4

同样适用于西欧其他地区。亚洲至少需要utf8。表情符号和一些汉字需要utf8mb4。

如果你最终得到问号,Mojibake等,请调试它here

术语:MySQL之外:UTF-8;在MySQL内部:utf8mb4。那些基本相同。 MySQL的utf8是其中的一部分。

Tést¥,十六进制:

54 E9 73 74 A5 -- cp1256, dec8, latin1, latin5  encoding
54 C3A9 73 74 C2A5 -- utf8, utf8mb4  encoding
54 C383 C2A9 73 74 C382 C2A5 -- "double encoded"; may show as Tést¥