我在排序 MYSQL 结果时遇到问题..
SELECT * FROM table WHERE something ORDER BY column ASC
列设置为 utf8_unicode_ci..
结果,我首先得到列以波斯尼亚字母开头的行,然后是其他列。
šablabl
šeblabla
čeblabla
aaaa
bbaa
bbb
ccc
MYSQL 版本是 5.1.61
我在排序 MYSQL 结果时遇到问题..
SELECT * FROM table WHERE something ORDER BY column ASC
列设置为 utf8_unicode_ci..
结果,我首先得到列以波斯尼亚字母开头的行,然后是其他列。
šablabl
šeblabla
čeblabla
aaaa
bbaa
bbb
ccc
MYSQL 版本是 5.1.61
这是因为制作了unicode的方式。所有“正常”的拉丁字符都恢复了与 ASCII 相同的数字对应关系,之后添加了来自其他文化的其他字符。这意味着如果您的字母表包含 26 个常规 ASCII 字符之外的其他字符,则它不会以 Unicode 中的正确顺序出现。
我认为您应该尝试更改列上的排序规则(也许您还必须更改字符集,但也许不必)。
使用中欧排序规则。
祝你好运 !!
较旧的问题和大量答案。
也许我处理问题的方式会对某人有所帮助。
我使用 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-collation.html
编辑:
我还注意到一件事:
...那么你最好有排序规则集(例如UTF8),否则你会得到SQL错误,例如:
“语法错误或访问冲突:1253 COLLATION 'utf8_polish_ci' 对 CHARACTER SET 'latin1' 无效”
... 奇怪,但真实
如果这确实是您所看到的,那么您发现了一个错误:utf8_unicode_ci
应该认为 š 等同于 s 和 č 等同于 c!
无论如何,MySQL 确实没有很好地支持中欧语言的 utf8 排序规则:你只会得到 Czech、Slovak 和 Slovenian。如果这些都不适合您,我想您必须创建自己的 utf8 排序规则,或者使用非 Unicode 字符集并使用那里可用的排序规则。