我有一个较旧的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。
答案 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和/或collation,则会覆盖表的默认值。
有一句老话:"如果它没有破坏,就不要修理它。"我倾向于制作新的数据库/表/列utf8mb4,但只留下旧的数据库/表/列。注意:混合物没问题。 连接指定客户端使用的编码。在INSERT
或SELECT
期间,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¥