Sql 数据库中的非拉丁字符使用“排序”;“订购”;

Sql 数据库中的非拉丁字符使用“排序”;“订购”;,sql,database,string,comparison,sql-order-by,Sql,Database,String,Comparison,Sql Order By,我刚刚发现数据库的“orderby”子句有一些奇怪的行为。在字符串比较中,考虑到字符在ASCII表中的顺序,我希望一些字符(如“[”和“25;”)大于拉丁字符/数字(如“I”或“2”)。但是,数据库的“order by”子句的排序结果与我的预期不同。下面是我的测试: SQLite版本3.6.23 输入“.help”以获取说明 输入以“;”结尾的SQL语句 sqlite>创建表产品(名称varchar(10)); sqlite>插入产品值('ipod'); sqlite>插入产品值(“iphon

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

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


这种行为不同于Java的字符串比较(我花了一些时间来发现这个问题)。我可以在SQLite 3.6.23和Microsoft SQL Server 2005中验证这一点。我进行了一些web搜索,但找不到任何相关文档。有人能给我介绍一下吗?这是SQL标准吗?我在哪里可以找到有关这一点的信息?提前感谢。

小写字符(如“I”)的ASCII码大于小写字符s表示“[”和“u”:

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

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

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

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

在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'

UTF8\u BIN
根据字符的unicode对字符进行排序。大写字母的unicode较低,因此优先

UTF8\u GENERAL\u CI
根据字母位置对字符进行排序,不考虑大小写


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

本例中的重要关键字是。我没有使用SQLite的经验,但希望它与其他数据库引擎类似,因为您可以定义用于整个数据库、单个表、每个连接等的排序规则


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

Huh?这正是Java对我的排序方式。您使用的是哪种Java?我的背后是什么?对不起,我想简化我的问题,以便其他人可以轻松复制它,但我太匆忙了,sqlite3示例不正确。我只能在SQL Server 2中找到这个问题SQLite默认使用二进制排序规则(忘记指定我的答案是关于SQLite的)。
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'