3

我想在我的 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', 'ċ', ...)但这似乎不适用于这种情况。

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

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

4

3 回答 3

3

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

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

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

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

于 2012-09-15T17:56:25.797 回答
2

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

于 2012-09-17T19:16:21.940 回答
1

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

于 2012-09-15T17:34:07.897 回答