德语最佳的MySQL排序规则是什么?

30

我正在建设一个德语网站,因此将使用像ä, ü, ß等字符,您有什么建议?

5个回答

31

这个答案已经过时了。想要完整的表情符号支持,请查看这个答案

对于字符集,如果可以的话请使用UTF-8。

至于排序规则,对于带有特殊字符的语言会比较麻烦。有多种不同类型的排序规则,它们都能存储含有变音符号和其他特殊字符的字符串,但它们在排序时处理这些字符的方式不同,比如是否区分大小写、重音符号等等。

u = ü 

真或假;在排序中(字母表中umlauts的位置)。

简而言之,您最好选择以下其中一个:

utf8_unicode_ci

它允许大小写不敏感的搜索; 它将ß视为ss并使用DIN-1排序。可惜,像所有非二进制Unicode排序一样,它也将u = ü 视为相同,这是一个很大的麻烦,因为搜索“Muller”也会返回“Müller”。您需要通过实时设置一个umlauts感知排序规则来解决这个问题。

或者 utf8_bin

此排序规则没有u = ü的问题,但只能进行区分大小写的搜索。

我不确定使用二进制排序规则是否还有其他副作用;我在这里提出了一个相关问题。


这个MySQL手册页面为各种排序规则以及它们在日常使用中带来的后果提供了良好的概述。

这里是mySQL可用排序规则的概述。


我知道这个问题很老了,但是...我正在尝试应用类似于您上面提到的utf8排序规则。然而,当使用utf8_unicode_ci时,字符“é”编码为“?”。你有任何想法为什么会这样吗?我以为utf8对每个字符都有一个表示。 - whwright
@Pekka,既然utf8存在缺陷(不是真正的Unicode),为什么你推荐它而不是utf8mb4 - Pacerier
截至2019年,正确答案如下:https://dev59.com/aG035IYBdhLWcg3wQtsg#48325386 - wedi
1
@wedi 我无法更改已接受的答案,但那个绝对更好。 - Pekka

18
为了支持完整的UTF-8标准,您必须在MySQL中使用字符集utf8mb4和排序规则utf8mb4_unicode_ci!请注意:当使用所谓的utf8字符集时,MySQL仅支持1到3字节的字符!这就是为什么现代表情符号不受支持的原因,因为它们使用4个字节!要完全支持UTF-8标准的唯一方法是将所有表格和数据库本身的字符集和排序规则更改为utf8mb4和utf8mb4_unicode_ci。此外,数据库连接也需要使用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个字节,并且需要小于3072。

当启用innodb_large_prefix配置选项时,对于使用DYNAMIC和COMPRESSED行格式的InnoDB表,这个长度限制被提高到3072字节。

要更改数据库的字符集和默认排序规则,请运行此命令:

ALTER DATABASE CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

由于utf8mb4完全向后兼容utf8,因此不应发生任何乱码或其他形式的数据丢失。


3

6
我认为您的意思是 utf8_general_ci 或者 utf8_unicode_ci - Tim Strehle

3
上述评论并没有真正解决德语umlauts的具体问题,这个问题通常被描述为:字典顺序或电话簿顺序?Unicode默认适用于前者,但是如果您希望'Ü' = 'UE',那么可以考虑使用utf8mb4_de_pb_0900_ai_ci或utf8mb4_german2_ci,假设字符集为utf8mb4。

0

这是一个重要的问题,因为它涉及到德语。使用utf8mb4_unicode_ci,字母uü是相同的。如果您有一个唯一索引(例如用户名),那么"blume"和"blüme"将无法工作,因为它们对于utf8mb4_unicode_ci来说是相同的单词(重复键错误)。为了解决这个问题,您可以使用utf8mb4_german2_ci


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接