【问题标题】:What is the best MySQL collation for German language德语的最佳 MySQL 排序规则是什么
【发布时间】:2011-07-28 10:11:10
【问题描述】:

我正在建立一个德语网站,所以我将使用ä, ü, ß 等字符,那么您有什么建议?

【问题讨论】:

    标签: mysql encoding collation


    【解决方案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 年正确答案如下:stackoverflow.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。

      【讨论】:

        猜你喜欢
        • 2011-10-22
        • 2019-07-02
        • 2021-10-04
        • 2010-12-28
        • 1970-01-01
        • 2017-06-19
        • 2013-08-05
        • 1970-01-01
        • 2011-10-09
        相关资源
        最近更新 更多