MySQL自定义字母顺序

MySQL自定义字母顺序,mysql,Mysql,我想在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 但是,我要求他们拥有以下订单: a b

我想在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
但是,我要求他们拥有以下订单:

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中实现这种定制排序

我见过这样的解决方案,它们使用
按字段排序(名称,'a','b','ċ',…)
,但这似乎不适用于这种情况

我还尝试向order函数添加排序规则,如:
orderbyradials-collateutf8\uunicode\uci
,但这实际上将重音字符视为相同的。因此,我会得到像“aċd”、“ace”、“aċf”这样的排序字符串,但这也是错误的(它应该是“aċd”、“aċf”、“ace”)


我的后备计划当然是用PHP进行排序,但如果我能将排序保持在MySQL本身,那将更加整洁。有什么想法吗?

您仍然可以使用
字段
,但它测试字符串之间的相等性。
因为在您的例子中,所有参数都是1个字符的字符串,所以必须使用
按字段排序(左(名称,1),'a',…)
。它只会对第一个字符进行排序,不过…

在MySQL中,排序规则定义了如何对字符集进行排序和分组。如果排序规则已由特定语言定义,则可能已经存在适合您的正确排序规则

此列表列出了当前排序规则:

否则,您可以添加自己的自定义排序规则:


编辑:重读这个问题,我发现您已经尝试了各种排序规则,所以您可能只需要添加自己的自定义排序规则。

我接受了Gavin Towey的建议,自己编写了这样一个排序规则。如果将来有人偶然发现这一点并对此感兴趣,这里有一个GitHub存储库:

感谢您的想法,但不幸的是,仅对第一个字符进行排序不足以满足我的需要。我没有考虑过,在不重新编译MySQL的情况下添加排序规则是可能的(这绝对不是一个选项)。谢谢你的链接,我真的会尝试这样做。这太酷了!我很高兴这个建议很有帮助,看到你的工作成果真的很有趣。谢谢分享。