使用“order by”在数据库中排序的非拉丁字符

时间:2010-03-25 13:35:43

标签: sql database string comparison sql-order-by

我刚刚发现数据库的“order by”子句有一些奇怪的行为。在字符串比较中,我预计一些字符如'['和'_'大于拉丁字符/数字,例如'I'或'2',考虑它们在ASCII表中的顺序。但是,数据库的“order by”子句的排序结果与我的期望不同。这是我的测试:

<击>     SQLite版本3.6.23
    输入“.help”获取说明     输入以“;”结尾的SQL语句     源码&GT;创建表产品(名称varchar(10));
    源码&GT;插入产品值('ipod');
    源码&GT;插入产品值('iphone');
    源码&GT;插入产品值('[apple]');
    源码&GT;插入产品值('_ ipad');
    源码&GT;从产品订单中选择*按名称asc;
    [苹果]
    _ipad
    iphone
    iPod的

select * from products order by name asc;
name
...
[B@
_ref
123
1ab
...

这种行为与Java的字符串比较(我花了一些时间来查找此问题)不同。我可以在 SQLite 3.6.23和 Microsoft SQL Server 2005中验证这一点。我做了一些网络搜索,但找不到任何相关文档。有人能给我一些启示吗?它是SQL标准吗?我在哪里可以找到关于此的一些信息?提前谢谢。

3 个答案:

答案 0 :(得分:2)

比较和排序数据库中字符的概念称为校对

如何存储字符串取决于通常在服务器,客户端或会话属性中设置的排序规则。

MySQL

SELECT  *
FROM    (
        SELECT  'a' AS str
        UNION ALL
        SELECT  'A' AS str
        UNION ALL
        SELECT  'b' AS str
        UNION ALL
        SELECT  'B' AS str
        ) q
ORDER BY
        str COLLATE UTF8_BIN


--
'A'
'B'
'a'
'b'

SELECT  *
FROM    (
        SELECT  'a' AS str
        UNION ALL
        SELECT  'A' AS str
        UNION ALL
        SELECT  'b' AS str
        UNION ALL
        SELECT  'B' AS str
        ) q
ORDER BY
        str COLLATE UTF8_GENERAL_CI


--
'a'
'A'
'b'
'B'

UTF8_BIN根据unicode对字符进行排序。帽子有较低的unicodes,因此首先出现。

UTF8_GENERAL_CI根据字母位置对字符进行排序,无视大小写。

排序对索引也很重要,因为索引很大程度上依赖于排序和比较规则。

答案 1 :(得分:1)

在这种情况下,重要的关键字是'collation'。我没有SQLite的经验,但是期望它与其他数据库引擎类似,因为你可以定义用于整个数据库,单个表,每个连接等的排序规则。

检查您的数据库文档以了解可用的选项。

答案 2 :(得分:0)

小写字符(如“i”)的ASCII码大于“[”和“_”的ASCII码:

'i': 105
'[': 91
'_': 95

但是,尝试插入大写字符,例如。尝试使用“IPOD”或“Iphone”,这些将在“_”和“[”之前使用默认的二进制排序规则。