德语的最佳 MySQL 排序规则是啥
Posted
技术标签:
【中文标题】德语的最佳 MySQL 排序规则是啥【英文标题】:What is the best MySQL collation for German language德语的最佳 MySQL 排序规则是什么 【发布时间】:2011-07-28 10:11:10 【问题描述】:我正在建立一个德语网站,所以我将使用ä, ü, ß
等字符,那么您有什么建议?
【问题讨论】:
【参考方案1】:这个答案已经过时了。如需完整的表情符号支持,请参阅this answer。
作为字符集,如果可以的话,绝对是UTF-8。
作为排序规则 - 这对于带有特殊字符的语言来说有点讨厌。有各种类型的排序规则。它们都可以存储所有元音变音和其他字符,但是它们在比较中如何对待元音变音不同,即是否
u = ü
是真还是假;并在排序中(在字母表中,元音变音符号位于排序顺序中)。
长话短说,您最好的选择是
utf8_unicode_ci
它允许不区分大小写的搜索;它将ß
视为ss
并使用DIN-1 排序。可悲的是,像所有非二进制 Unicode 排序规则一样,它处理 u = ü
这是一个可怕的麻烦,因为搜索“Muller”也会返回“Müller”。您将不得不通过实时设置 Umlaut-aware 排序规则来解决这个问题。
或utf8_bin
此排序规则没有u = ü
问题,但只能进行区分大小写的搜索。
我不完全确定使用二进制排序规则是否还有其他副作用;我问了一个关于here的问题。
This mysql manual page 很好地概述了各种排序规则以及它们在日常使用中带来的后果。
Here 是关于 mySQL 中可用排序规则的一般概述。
【讨论】:
我知道这是超级旧的,但是...我正在尝试应用类似于您上面的 utf8 排序规则。但是,当使用 utf8_unicode_ci 时,字符 'é' 编码为 '?'。你知道这是为什么吗?我认为 utf8 对每个字符都有一个表示。 @Pekka,既然utf8
是有缺陷的(不是真正的unicode),你为什么推荐它而不是utf8mb4
?
截至 2019 年正确答案如下:***.com/a/48325386/2898712
@wedi 我无法更改已接受的答案,但那肯定更好。【参考方案2】:
要支持完整的 UTF-8 标准,您必须在 MySQL 中使用字符集 utf8mb4
和排序规则 utf8mb4_unicode_ci
!
注意: MySQL 在使用其所谓的 utf8
字符集时仅支持 1 到 3 字节字符!这就是现代 Emoji 不支持的原因,因为它们使用 4 字节!
完全支持 UTF-8 标准的唯一方法是将所有 表 和 数据库 本身的字符集和排序规则更改为 utf8mb4
和 @987654325 @。此外,数据库connection也需要使用utf8mb4。
mysql服务器必须使用utf8mb4作为默认字符集,可以在/etc/mysql/conf.d/mysql.cnf中手动配置
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
# character-set-client-handshake = FALSE ## better not set this!
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
可以使用以下 SQL 语句将现有表迁移到 utf8mb4:
ALTER TABLE <table-name> CONVERT TO
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
注意:
为确保表列之间的任何 JOIN 不会因字符集编码而变慢,所有表都必须更改! 由于 MySQL 中索引的长度是有限的,因此每个索引行的字符总数必须乘以 4 Byte,并且需要小于 3072启用 innodb_large_prefix 配置选项时,此 对于使用 DYNAMIC 和 COMPRESSED 行格式。
要更改数据库的字符集和默认排序规则,请运行以下命令:
ALTER DATABASE CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
由于 utf8mb4 完全向后兼容 utf8,因此不会发生 mojibake 或其他形式的数据丢失。
【讨论】:
【参考方案3】:utf-8-general-ci
或 utf-8-unicode-ci
。
要知道区别: UTF-8: General? Bin? Unicode?
【讨论】:
我想你的意思是utf8_general_ci
或utf8_unicode_ci
。【参考方案4】:
上述 cmets 并没有真正解决德语变音符号的具体问题,通常被描述为:字典顺序还是电话簿顺序? Unicode 默认值适用于前者,但如果(例如)你想要 'Ü' = 'UE' 那么你可以考虑使用 utf8mb4_de_pb_0900_ai_ci 或 utf8mb4_german2_ci,假设字符集是 utf8mb4。
【讨论】:
以上是关于德语的最佳 MySQL 排序规则是啥的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 与 MySQL 的 unicode_ci 排序规则的类似物是啥?
使用 utf8_general_ci 排序规则和 utf8 字符集服务器的德语变音符号的搜索结果区分大小写