根据sqlite3文档,
每个后面的 COLLATE 子句 列名定义排序规则 用于其中文本条目的序列 柱子。默认整理顺序 是为以下内容定义的整理顺序 CREATE TABLE 中的该列 陈述。或者如果没有整理顺序 另有定义时,内置 使用 BINARY 整理序列。
整理序列有什么作用,什么是 BINARY 整理序列?
这是sql引擎内部对数据进行排序的方式。二进制排序规则正如其所暗示的那样,它进行二进制比较。一般来说,它是最快的排序规则,尽管我从未量化过它,因为它检查位模式,这意味着它区分大小写和重音。
二进制排序规则逐字节比较字符串,就像在 unicode 表中一样。例如:A、B、a、b。 不区分大小写 (NOCASE) 的顺序为:a,A,b,B。
二进制排序规则的优点是它的速度,因为字符串比较非常简单/快速。一般情况下,二进制索引可能不会产生预期的排序结果;然而,对于精确匹配,它们可能很有用。
COLLATE NOCASE 也会影响区分大小写的查询。
如果您有一列包含以下值:“aa”、“aA”
select * from table where col = 'aa'
如果您使用 COLLATE NOCASE 创建列,它将返回“aa”和“aA”。否则,如果您没有指定,它将仅返回 'aa'。
您还可以在查询中指定它(这比您使用 COLLATE NOCASE 创建列要慢)
select * from table where col = 'aa' COLLATE NOCASE
排序规则不仅影响索引或结果的排序,还可能影响表上某些操作的有效性。因此,您可能会发现将不区分大小写的文本列定义为主键(或使用
UNIQUE
约束)是合适的,如下所示:
CREATE TABLE t1 (
id TEXT COLLATE NOCASE PRIMARY KEY
);
插入
id
值'a'
后,
INSERT INTO t1 VALUES ('a');
不可能添加另一个具有值
id
的 'A'
(仅因情况而异)。以下 SQL
INSERT INTO t1 VALUES ('A');
将会失败
Runtime error: UNIQUE constraint failed: t1.id (19)
不过可以将
id
值从小写更改为大写:
UPDATE t1 SET id = 'A' WHERE id = 'A';
...这非常有趣,因为 where 子句实际上不区分大小写,并且更改是从类似于
A
的内容更改为正确的 A
。