gpt4 book ai didi

sql - 数据库中的非拉丁字符排序为 "order by"

转载 作者:太空狗 更新时间:2023-10-30 01:56:51 26 4
gpt4 key购买 nike

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

<罢工> SQLite 版本 3.6.23
输入“.help”获取说明
输入以“;”结尾的 SQL 语句
sqlite> 创建表 products(name varchar(10));
sqlite> 插入产品值('ipod');
sqlite> 插入产品值('iphone');
sqlite> 插入产品值('[apple]');
sqlite> 插入产品值('_ipad');
sqlite> select * from products order by name asc;
[苹果]
_iPad
苹果手机
苹果手机

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

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

最佳答案

在数据库中比较和排序字符的概念称为排序规则

字符串的存储方式取决于通常在服务器、客户端或 session 属性中设置的排序规则。

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 对字符进行排序。大写字母具有较低的 unicode,因此排在前面。

UTF8_GENERAL_CI 根据字母顺序对字符进行排序,不考虑大小写。

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

关于sql - 数据库中的非拉丁字符排序为 "order by",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2515918/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com