我有一个较旧的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。
1条答案
按热度按时间svmlkihl1#
如果在声明的列上有任何索引
VARCHAR(255)
,转换为utf8mb4时可能会出现“索引大于767字节”的错误。有5种解决方法。如果没有索引的191到255个字符之间的varchar,那么
将转换表中的所有列
tbl
至utf8mb4。如果您碰巧在“双重编码”中将utf8字节错误地存储到拉丁1中,则需要另一种修复方法。检查各种情况下的修复。
“default”字符集或排序规则只是一个默认值。也就是说,当创建一个新的列或表时,它采用默认值。如果显式指定列的字符集和/或排序规则,则会覆盖表的默认值。
有句老话说:“如果它没有坏,就不要修复它。”我倾向于用utf8mb4创建新的数据库/表/列,但不要使用旧的数据库/表/列。注意:有混合物就可以了。连接指定客户端使用的编码。mysql,在
INSERT
或者SELECT
将从/转换为客户端的设置,从/转换为列的设置。西班牙语的字符集有限。这个字符集是latin1、utf8和utf8mb4的子集,所以这些字符集中的任何一个都可以与西班牙语一起使用。然而,编码是不同的。例如,
ñ
是西欧其他国家也是如此。亚洲至少需要utf8。表情符号和一些汉字需要utf8mb4。
如果最后出现问号、mojibake等问题,请在此处进行调试。
术语:外部mysql:
UTF-8
; mysql内部:utf8mb4
. 这些基本上是一样的。mysql的utf8
是它们的一个子集。Tést¥
,十六进制: