我刚刚发现数据库的“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标准吗?我在哪里可以找到关于此的一些信息?提前谢谢。
答案 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”,这些将在“_”和“[”之前使用默认的二进制排序规则。