德语的最佳 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-ciutf-8-unicode-ci

要知道区别: UTF-8: General? Bin? Unicode?

【讨论】:

我想你的意思是utf8_general_ciutf8_unicode_ci【参考方案4】:

上述 cmets 并没有真正解决德语变音符号的具体问题,通常被描述为:字典顺序还是电话簿顺序? Unicode 默认值适用于前者,但如果(例如)你想要 'Ü' = 'UE' 那么你可以考虑使用 utf8mb4_de_pb_0900_ai_ci 或 utf8mb4_german2_ci,假设字符集是 utf8mb4。

【讨论】:

以上是关于德语的最佳 MySQL 排序规则是啥的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 最佳排序规则?

SQL Server 与 MySQL 的 unicode_ci 排序规则的类似物是啥?

使用 utf8_general_ci 排序规则和 utf8 字符集服务器的德语变音符号的搜索结果区分大小写

mysql 5.5 utf-8 排序规则 utf8_unicode_ci, pymysql

所有语言的 MySQL 排序规则

更改SQL Server 2012 数据库排序规则