创建sqlite索引时COLLATE关键字有什么作用?

问题描述 投票:0回答:3

根据sqlite3文档

每个后面的 COLLATE 子句 列名定义排序规则 用于其中文本条目的序列 柱子。默认整理顺序 是为以下内容定义的整理顺序 CREATE TABLE 中的该列 陈述。或者如果没有整理顺序 另有定义时,内置 使用 BINARY 整理序列。

整理序列有什么作用,什么是 BINARY 整理序列?

sql sqlite indexing collate
3个回答
9
投票

这是sql引擎内部对数据进行排序的方式。二进制排序规则正如其所暗示的那样,它进行二进制比较。一般来说,它是最快的排序规则,尽管我从未量化过它,因为它检查位模式,这意味着它区分大小写和重音。


7
投票

二进制排序规则逐字节比较字符串,就像在 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

0
投票

排序规则不仅影响索引或结果的排序,还可能影响表上某些操作的有效性。因此,您可能会发现将不区分大小写的文本列定义为主键(或使用

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

© www.soinside.com 2019 - 2024. All rights reserved.