1

我在排序 MYSQL 结果时遇到问题..

SELECT * FROM table WHERE something ORDER BY column ASC

设置为 utf8_unicode_ci..

结果,我首先得到以波斯尼亚字母开头的行,然后是其他列。

šablabl
šeblabla
čeblabla
aaaa
bbaa
bbb
ccc

MYSQL 版本是 5.1.61

4

4 回答 4

1

BGI是对的。您需要使用适当的排序规则。不幸的是,MySQL 还没有中欧 unicode 排序规则。 MariaDb由 MySQL 的创建者维护的 MySQL 分支。

因此,您可以将文本从 utf8 转换为 latin2,然后使用中欧整理顺序进行排序。例如。

  SELECT * 
    FROM tab
ORDER BY CONVERT(text USING latin2) COLLATE latin2_croatian_ci

看到这个小提琴:http ://sqlfiddle.com/#!2/c8dd4/1/0

于 2012-10-20T13:05:52.253 回答
0

这是因为制作了unicode的方式。所有“正常”的拉丁字符都恢复了与 ASCII 相同的数字对应关系,之后添加了来自其他文化的其他字符。这意味着如果您的字母表包含 26 个常规 ASCII 字符之外的其他字符,则它不会以 Unicode 中的正确顺序出现。

我认为您应该尝试更改列上的排序规则(也许您还必须更改字符集,但也许不必)。

使用中欧排序规则

祝你好运 !!

于 2012-10-20T12:15:45.610 回答
0

较旧的问题和大量答案。

也许我处理问题的方式会对某人有所帮助。

我使用 PDO。我的数据库是 utf-8。

首先 - 我的数据库单例代码(它的相关部分)。我将所有连接的“SET NAMES”设置为“utf8”。

     $attrib_array = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
     如果(DB_HANDLER)
           $attrib_array[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
       self::$instance = new PDO(DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS, $attrib_array);

其次 - 我的排序看起来像这样 - 排序取决于语言(示例显示波兰语):

      ORDER BY some_column 整理 utf8_polish_ci DESC

为了使事情更加精简,我使用了一个常量,我在 lang 翻译文件中定义了它,所以当文件被拉出时,会设置正确的排序规则常量。当然我有'utf8_general_ci'作为默认值。例子:

      定义('MY_LOCALIZED_COLLATE','COLLATE utf8_polish_ci');

现在,我的(相关部分)查询如下所示:

      “……按 some_column 排序”。MY_LOCALIZED_COLLATE 。"DESC" ;

以上在大多数情况下都有效。

如果您缺少排序规则集,您可以尝试自己添加一个。

有关创建此类集合的更多详细信息 - 请参见此处:http ://dev.mysql.com/doc/refman/5.0/en/adding-collat​​ion.html

编辑

我还注意到一件事:

  • 如果您有要排序的列表,例如波兰语
  • 并且您必须强制进行适当的排序以进行排序(如上所述)
  • 并且您使用例如 INT 列作为排序向量

...那么你最好有排序规则集(例如UTF8),否则你会得到SQL错误,例如:

“语法错误或访问冲突:1253 COLLATION 'utf8_polish_ci' 对 CHARACTER SET 'latin1' 无效”

... 奇怪,但真实

于 2013-05-11T13:08:35.167 回答
0

如果这确实是您所看到的,那么您发现了一个错误:utf8_unicode_ci应该认为 š 等同于 s 和 č 等同于 c!

无论如何,MySQL 确实没有很好地支持中欧语言的 utf8 排序规则:你只会得到 Czech、Slovak 和 Slovenian。如果这些都不适合您,我想您必须创建自己的 utf8 排序规则,或者使用非 Unicode 字符集并使用那里可用的排序规则。

于 2012-10-20T15:17:40.990 回答