mysql数据库编码,拉丁文1和utf-8的混合

gkn4icbw  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(497)

我有一个较旧的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

我不知道为什么最初的开发人员使用拉丁文1进行编码和排序。没有理由这么说。
我真的不想更改任何现有数据库的任何编码,我只想用utf8mb4创建新表。但我想得越多,为了保持一致,我可能会想改变他们。我创建的最后一个数据库是 warehouseinventory 但是我没有注意到编码,我假设它默认为 latin1 基于先前创建的数据库的编码。
我有什么理由把这些留在家里吗 latin1 改变他们会不会很痛苦?其中一个数据库确实存储了西班牙语,但我一直认为那只是utf。

svmlkihl

svmlkihl1#

如果在声明的列上有任何索引 VARCHAR(255) ,转换为utf8mb4时可能会出现“索引大于767字节”的错误。有5种解决方法。
如果没有索引的191到255个字符之间的varchar,那么

ALTER TABLE tbl CONVERT TO utf8mb4;

将转换表中的所有列 tbl 至utf8mb4。
如果您碰巧在“双重编码”中将utf8字节错误地存储到拉丁1中,则需要另一种修复方法。检查各种情况下的修复。
“default”字符集或排序规则只是一个默认值。也就是说,当创建一个新的列或表时,它采用默认值。如果显式指定列的字符集和/或排序规则,则会覆盖表的默认值。
有句老话说:“如果它没有坏,就不要修复它。”我倾向于用utf8mb4创建新的数据库/表/列,但不要使用旧的数据库/表/列。注意:有混合物就可以了。连接指定客户端使用的编码。mysql,在 INSERT 或者 SELECT 将从/转换为客户端的设置,从/转换为列的设置。
西班牙语的字符集有限。这个字符集是latin1、utf8和utf8mb4的子集,所以这些字符集中的任何一个都可以与西班牙语一起使用。然而,编码是不同的。例如, ñ

Hex F1   in latin1
Hex C3B1 in utf8 and utf8mb4

西欧其他国家也是如此。亚洲至少需要utf8。表情符号和一些汉字需要utf8mb4。
如果最后出现问号、mojibake等问题,请在此处进行调试。
术语:外部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¥

相关问题