MYSQL 5.1.61在utf8中为中欧语言排序

时间:2012-10-20 12:05:59

标签: mysql sorting utf-8 character-encoding collation

我在排序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 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

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

使用Central European collation

祝你好运!!

答案 2 :(得分:0)

如果那是你看到的,你发现了一个错误:utf8_unicode_ci应该考虑š相当于s和č相当于c!

无论如何,MySQL对中欧语言的utf8校对没有很大的支持:you get only Czech, Slovak, and Slovenian。如果这些都不适合你,我想你必须create your own utf8 collationuse a non-Unicode character set并使用那里可用的排序规则。

答案 3 :(得分:0)

更老的问题和大量的答案。

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

我使用PDO。我的DB是utf-8。

首先 - 我的db单例代码(相关部分)。我为所有连接设置'SET NAMES'为'utf8'。

     $attrib_array = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
     if (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 COLLATE utf8_polish_ci DESC

为了使事情更精简,我使用了一个常量,我在lang翻译文件中定义,所以当拉取文件时,设置正确的校对常量。当然我默认使用'utf8_general_ci'。例如:

      define('MY_LOCALIZED_COLLATE', 'COLLATE utf8_polish_ci');

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

      " ... ORDER BY some_column " . MY_LOCALIZED_COLLATE . " DESC" ;

以上情况适用于大多数情况。

如果您缺少整理设置,可以尝试自己添加一个。

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

修改

我注意到了另一件事:

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

...那么你最好设置校对(例如UTF8),否则你会得到SQL错误,例如:

"Syntax error or access violation: 1253 COLLATION 'utf8_polish_ci' is not valid for CHARACTER SET 'latin1'"

......很奇怪,但是真的