MYSQL 数据库编码,latin1 和 utf-8 的混合
MYSQL database encoding, mix of latin1 and utf-8
我有一个旧的 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。
如果您在声明为 VARCHAR(255)
的列上有任何索引,则在转换为 utf8mb4 时可能会收到有关 "index bigger than 767 bytes" 的错误。有 5 workarounds .
如果您没有索引的 191 到 255 个字符之间的任何 varchars,那么
ALTER TABLE tbl CONVERT TO utf8mb4;
会将tabletbl
中的所有列转换为utf8mb4。
如果您碰巧在 "double encoding" 中将 utf8 字节错误地存储到 latin1 中,您需要一个不同的修复程序。评论 Fixes for various Cases .
"default" 字符集或排序规则就是默认值。也就是说,当创建新列或 table 时,它采用 默认值 。如果您为列显式指定字符集 and/or 排序规则,则会覆盖 table.
的默认值
有一句老话:"If it ain't broke, don't fix it."我倾向于制作新的databases/tables/columns utf8mb4,但不要管旧的。注意:混合使用是可以的。 connection 指定 client 使用的编码。 MySQL,在 INSERT
或 SELECT
期间将转换 from/to 客户端的设置 to/from 列的设置。
西班牙语的字符集有限。该集是 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¥
我有一个旧的 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。
如果您在声明为 VARCHAR(255)
的列上有任何索引,则在转换为 utf8mb4 时可能会收到有关 "index bigger than 767 bytes" 的错误。有 5 workarounds .
如果您没有索引的 191 到 255 个字符之间的任何 varchars,那么
ALTER TABLE tbl CONVERT TO utf8mb4;
会将tabletbl
中的所有列转换为utf8mb4。
如果您碰巧在 "double encoding" 中将 utf8 字节错误地存储到 latin1 中,您需要一个不同的修复程序。评论 Fixes for various Cases .
"default" 字符集或排序规则就是默认值。也就是说,当创建新列或 table 时,它采用 默认值 。如果您为列显式指定字符集 and/or 排序规则,则会覆盖 table.
的默认值有一句老话:"If it ain't broke, don't fix it."我倾向于制作新的databases/tables/columns utf8mb4,但不要管旧的。注意:混合使用是可以的。 connection 指定 client 使用的编码。 MySQL,在 INSERT
或 SELECT
期间将转换 from/to 客户端的设置 to/from 列的设置。
西班牙语的字符集有限。该集是 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¥