【问题标题】:MySQL custom alphabetical orderMySQL自定义字母顺序
【发布时间】:2012-09-08 12:09:39
【问题描述】:

我想在我的 MySQL 查询中自定义字母排序顺序。 马耳他语使用标准拉丁字母以及以下字符:ċġħż。我使用utf8_bin 排序规则,因为 ċc 不同(等等)。 结果是当我使用ORDER BY 时,字母按以下顺序处理:

a b c d e f g h i j k l m n o p q r s t u v w x y z ċ ġ ħ ż

但是我要求他们有这个订单:

a b ċ c d e f ġ g h ħ i j k l m n o p q r s t u v w x y ż z

这意味着在升序中,“abċ”应该在“abz”之前,但目前它在之后,因为它只是比较二进制值人物。有没有办法在 MySQL 中实现这种自定义排序?

我见过像 this 这样使用 ORDER BY FIELD(name, 'a', 'b', 'ċ', ...) 的解决方案,但这似乎不适用于这种情况。

我还尝试向 order 函数添加排序规则,如下所示:ORDER BY radicals COLLATE utf8_unicode_ci,但这本质上将重音字符视为相同。所以,我会得到像“aċd”、“ace”、“aċf”这样的排序字符串,但这也是错误的(应该是“ aċd"、"aċf"、"ace")。

我的后备计划当然是在 PHP 中进行排序,但如果我可以将排序保留到 MySQL 本身会更整洁。有什么想法吗?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    在 MySQL 中,排序规则定义了如何处理字符集的排序和分组。如果您的排序规则已经由特定语言定义,那么您可能已经存在正确的排序规则。

    这列出了当前排序规则:http://dev.mysql.com/doc/refman/5.5/en/charset-charsets.html

    否则,您可以添加自己的自定义排序规则:http://dev.mysql.com/doc/refman/5.5/en/adding-collation.html

    编辑:重新阅读我看到您已经尝试过各种排序规则的问题 - 所以您可能只需要添加自己的自定义排序规则。

    【讨论】:

    • 我没有考虑过在不重新编译 MySQL 的情况下添加排序规则是可能的(这绝对不是一个选项)。感谢您的链接,我确实会尝试这样做。
    【解决方案2】:

    我接受了 Gavin Towey 的建议,自己编写了这样的整理。如果将来有人偶然发现并感兴趣,这里有一个 GitHub 存储库:Maltese MySQL Collation (utf8_maltese_ci)

    【讨论】:

    • 这太酷了!我很高兴这个建议很有帮助,看到你的工作成果真的很有趣。感谢分享。
    【解决方案3】:

    您仍然可以使用FIELD,但它会测试字符串之间的相等性。 由于在您的情况下,所有参数都是 1 个字符的字符串,因此您必须使用 ORDER BY FIELD(LEFT(name, 1), 'a', ...)。它只会对第一个字符进行排序...

    【讨论】:

    • 感谢您的想法,但不幸的是,仅对第一个字符进行排序不足以满足我的需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2012-11-02
    • 2014-10-13
    相关资源
    最近更新 更多