我在排序MYSQL结果时遇到问题..
SELECT * FROM table WHERE something ORDER BY column ASC
列设置为utf8_unicode_ci ..
因此,我首先获得以波斯尼亚字母开头的列的行,然后是其他行。
šablabl
šeblabla
čeblabla
aaaa
bbaa
bbb
ccc
MYSQL版本是5.1.61
答案 0 :(得分:1)
Bgi是对的。您需要使用适当的排序规则。不幸的是,MySQL还没有中欧unicode排序规则。 MariaDb,MySQL的分支由MySQL的创建者does维护。
因此,您可以将文本从utf8转换为latin2,然后使用中欧整理顺序进行排序。例如。
SELECT *
FROM tab
ORDER BY CONVERT(text USING latin2) COLLATE latin2_croatian_ci
答案 1 :(得分:0)
这是因为unicode的方式。所有“普通”拉丁字符都恢复了与ASCII相同的数字对应关系,之后添加了其他文化中的其他字符。这意味着如果您的字母表中有其他字符而不是26个常规ASCII字符,则它将不会以Unicode的正确顺序出现。
我认为您应该尝试更改列上的排序规则(也许您还必须更改字符集,但可能不会)。
祝你好运!!答案 2 :(得分:0)
如果那是你看到的,你发现了一个错误:utf8_unicode_ci
应该考虑š相当于s和č相当于c!
无论如何,MySQL对中欧语言的utf8校对没有很大的支持:you get only Czech, Slovak, and Slovenian。如果这些都不适合你,我想你必须create your own utf8 collation或use 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
修改强>:
我注意到了另一件事:
...那么你最好设置校对(例如UTF8),否则你会得到SQL错误,例如:
"Syntax error or access violation: 1253 COLLATION 'utf8_polish_ci' is not valid for CHARACTER SET 'latin1'"
......很奇怪,但是真的