sqlite 排序规则
- BINARY - 使用 memcmp() 对字符串数据进行比较,无论文本编码。
- NOCASE - 与 BINARY 相同,除了在比较执行之前会将 ASCII 码的 26 个大写字母被折换为与其等值的小写字母。注意,只有 ASCII 码的字符进行大小写折换。由于所需表的大小,SQLite 不会尝试对完整 UTF 的大小写进行折换。
- RTRIM - 与 BINARY 相同,除了尾随的空格将被忽略。
从 SQL 分配校对序列
每个表的每个列都有一个相关联的校对函数。如果没有校对函数被明确定义,校对规则默认为 BINARY。列定义的 COLLATE 子句被用来替代地为一个列定义校对函数。
为一个二元比较操作符(=、<、>、<=、>=、!=、IS 和 IS NOT)决定使用何种校对函数,按照下面展示的规则顺序进行:
- 如果两个操作数都使用 COLLATE 后缀操作符分配了一个明确的校对函数,那么明确的校对函数被用在比较中,左边操作数的校对函数有较高的优先级。
- 如果两个操作数都是一个列,左边列的校对函数有较高的优先级。前一句的目的是,带有一个或多个一元“+”操作符的列名仍被认为是一个列名。
- 否则,比较将会使用 BINARY 校对函数。
表达式“x BETWEEN y AND z”在逻辑上等价于两个比较“x >= y AND x <= z”,并且与校对函数一起工作,就像这是有两个分开的比较一样。表达式“x IN (SELECT y ...)”与“x = y”的处理方式一样,目的是为了确定校对序列。用在“x IN (y z ...)”格式表达式上的校对序列,就是 x 的校对序列。
ORDER BY 子句是一个 SELECT 语句的一部分,其规则是,可使用 COLLATE 操作符为 SELECT 语句分配一个校对序列,在这种情况下,特定的校对函数被用于排序。否则,如果通过 ORDER BY 子句进行排序的表达式是一个列,列的校对序列将被用来确定排序顺序。如果表达式不是一个列并且没有 COLLATE 子句,则 BINARY 校对序列将被使用。
校对序列示例
下面的例子用来辨认校对序列,这可被用来确定由各 SQL 语句执行的文本比较的结果。注意,在 NUMERIC、BLOB 或 NULL 值的情况,一个文本的比较并不是必须的,并且不会使用校对序列。
CREATE TABLE t1(
x INTEGER PRIMARY KEY
a /* 校对序列 BINARY */
b COLLATE BINARY /* 校对序列 BINARY */
c COLLATE RTRIM /* 校对序列 RTRIM */
d COLLATE NOCASE /* 校对序列 NOCASE */
);
/* x a b c d */
INSERT INTO t1 VALUES(1 'abc' 'abc' 'abc ' 'abc');
INSERT INTO t1 VALUES(2 'abc' 'abc' 'abc' 'ABC');
INSERT INTO t1 VALUES(3 'abc' 'abc' 'abc ' 'Abc');
INSERT INTO t1 VALUES(4 'abc' 'abc ' 'ABC' 'abc');
/* 使用 BINARY 校对序列执行文本比较 a = b。 */
SELECT x FROM t1 WHERE a = b ORDER BY x;
-- 结果 1 2 3
/* 使用 RTRIM 校对序列执行文本比较 a = b。 */
SELECT x FROM t1 WHERE a = b COLLATE RTRIM ORDER BY x;
-- 结果 1 2 3 4
/* 使用 NOCASE 校对序列执行文本比较 d = a。 */
SELECT x FROM t1 WHERE d = a ORDER BY x;
-- 结果 1 2 3 4
/* 使用 BINARY 校对序列执行文本比较 a = d。 */
SELECT x FROM t1 WHERE a = d ORDER BY x;
-- 结果 1 4
/* 使用 RTRIM 校对序列执行文本比较 'abc' = c。 */
SELECT x FROM t1 WHERE 'abc' = c ORDER BY x;
-- 结果 1 2 3
/* 使用 RTRIM 校对序列执行文本比较 c = 'abc'。 */
SELECT x FROM t1 WHERE c = 'abc' ORDER BY x;
-- 结果 1 2 3
/* 使用 NOCASE 校对序列进行分组(值“abc”、“ABC”和“Abc”被放在相同的分组中)。 */
SELECT count(*) FROM t1 GROUP BY d ORDER BY 1;
-- 结果 4
/* 使用 BINARY 校对序列执行分组。“abc”、“ABC”和“Abc”来自不同的分组。 */
SELECT count(*) FROM t1 GROUP BY (d || '') ORDER BY 1;
-- 结果 1 1 2
/* 使用 RTRIM 校对序列或列 c 执行排序。 */
SELECT x FROM t1 ORDER BY c x;
-- 结果 4 1 2 3
/* 使用 BINARY 校对序列或 (c || '') 执行排序。 */
SELECT x FROM t1 ORDER BY (c||'') x;
-- 结果 4 2 3 1
/* 使用 NOCASE 校对序列或列 c 执行排序。 */
SELECT x FROM t1 ORDER BY c COLLATE NOCASE x;
-- 结果 2 4 3 1
相关推荐
在SQLite中,我们可以创建一个自定义的Collation(排序规则)来处理中文排序。以下是一种简单的实现方式: 1. 创建自定义Collation: 在SQLite中,可以通过`CREATE COLLATION`语句定义一个新的排序规则。例如,...
2. `sqlite3ext.h`:这个头文件提供了SQLite的扩展机制,允许开发人员编写自定义的SQL函数、虚拟表模块或者Collation(排序规则)。通过`sqlite3_create_function_v2`等函数,可以将用户定义的C函数注册到SQLite,...
SQLite Expert: A powerful ... 查看所有的功能和安装排序规则每个SQLite扩展! 在3.0的新功能:自定义的外观和感觉的应用程序使用外观。 在3.0的新功能:发送到打印机的网格任何内容或将其导出到一个PDF文件。
SQLite可视化管理工具。...查看所有的功能和安装排序规则每个SQLite扩展! 3.0的新功能:自定义的外观和感觉的应用程序使用外观。 3.0的新功能:发送到打印机的网格任何内容或将其导出到一个PDF文件。
可以结合WHERE子句进行条件筛选,GROUP BY和HAVING用于数据分组,ORDER BY进行排序,LIMIT和OFFSET用于结果限制。此外,还可以使用JOIN操作连接多个表,进行复杂的数据分析。 6. 视图与索引:视图是虚拟表,基于一...
5. **B树索引**:SQLite使用B树作为索引结构,这使得快速查找和排序成为可能。源码中包含了B树节点的构建、遍历和维护算法。 6. **锁机制**:SQLite提供了多种锁级别(如共享锁、独占锁)来处理多用户并发访问。...
8. **扩展功能**:如函数扩展、虚拟表模块、自定义Collations(排序规则)等,这些可以增强SQLite的功能和适应性。 9. **错误处理与调试**:如何理解和处理SQLite运行时的错误,以及使用日志和调试工具进行问题排查...
索引页则是按照特定排序规则存储键值,以加速查询性能。 在实际应用中,SQLite文件读取工具可以帮助进行故障排查、数据迁移、数据库审计等工作。例如,当数据库出现损坏时,可以借助此类工具尝试恢复丢失的数据。...
其中,支持UTF-16编码格式和用户自定义文本排序规则显著增强了其国际化应用能力。同时,以索引列形式存储BLOB的能力提高了处理二进制大对象的效率。 ### SQLite API概览 SQLite提供了丰富的API,涵盖了数据库的...
SQLite允许用户通过编写自定义的VFS(虚拟文件系统)、SQL函数、 collation sequence(排序规则)等来扩展其功能。开发者可以利用这些接口来定制特定的需求。 集成到.NET和Java: SQLite提供.NET和Java的绑定,...
这个文件提供了一种机制,使得开发者可以编写自定义的SQL函数、虚拟表模块、 collation sequences(排序规则)等,以扩展SQLite3的功能。例如,通过实现`sqlite3_module`结构体,可以创建自定义的虚拟表模块,从而...
在SQLite3中集成MMICU ICU,可以增强对多语言文本的支持,使得数据库能够处理各种语言的数据,并提供正确的排序和比较规则。 FTS(Full-Text Search)是SQLite3的一个扩展,用于实现全文搜索引擎。它允许用户通过...
例如,它引入了新的文件格式以提高数据库的稳定性和性能,支持UTF-8和UTF-16字符编码,提供了用户定义的排序规则和列之间的亲和性,以及64位的行编号来支持更大规模的数据库操作。 然而,SQLite也有一些局限性。它...
- **用户定义的排序规则**:允许用户自定义排序规则,这在处理特定语言或地区的数据时非常有用。 - **64位行编号**:增加了对更大数据集的支持,提高了可扩展性。 - **并发性的提升**:改进了多线程环境下并发访问的...
3. **数据浏览**:以表格形式展示数据,支持排序、过滤和格式化,还可以直接编辑单元格内容,方便数据操作。 4. **数据库备份与恢复**:提供数据库备份和恢复功能,确保数据的安全。 5. **权限管理**:能够管理...
SQLite第三版中引入了用户定义的分类排序,允许开发者根据需要定义自己的分类规则。 64字节的行编号 SQLite第三版中引入了64字节的行编号,允许开发者使用更长的行编号。 改良的并发性 SQLite第三版中已经改良了...
- **用户自定义文本排序方法**:可以根据特定需求定制排序规则。 - **对BLOB字段建立索引**:提高了对二进制大对象数据的查询效率。 为了实现这些特性,SQLite3采用了全新的数据库格式,确保了与旧版本之间的不兼容...
2. **读取(Read)**: `SELECT`语句用于查询数据,可以配合`WHERE`子句进行筛选,使用`ORDER BY`进行排序,`GROUP BY`进行分组,`JOIN`进行表间关联,`DISTINCT`去除重复项。 3. **更新(Update)**: `UPDATE`语句...
总的来说,"android Sqlite城市编码表带city_num"是一个针对Android应用的SQLite数据库,包含城市编码信息,`city_num`字段可能用于标识、排序或查询城市数据。理解和利用好这个资源,可以帮助开发者高效地处理地理...
用户可以自定义排序规则,这对于处理非英语语言尤为重要。 ##### 64字节的行编号 为了支持更大的数据库,SQLite现在使用64字节的行编号。 ##### 改良的并发性 第三版在并发控制方面做出了改进,使得多个进程可以...