MySQL自定义字母顺序

时间:2012-09-15 17:27:26

标签: 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

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

我见过使用ORDER BY FIELD(name, 'a', 'b', 'ċ', ...)的{​​{3}}等解决方案,但在这种情况下似乎并不适用。

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

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

3 个答案:

答案 0 :(得分:3)

在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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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