`

sqlite排序规则

 
阅读更多

sqlite 排序规则

  • BINARY - 使用 memcmp() 对字符串数据进行比较,无论文本编码。
  • NOCASE - 与 BINARY 相同,除了在比较执行之前会将 ASCII 码的 26 个大写字母被折换为与其等值的小写字母。注意,只有 ASCII 码的字符进行大小写折换。由于所需表的大小,SQLite 不会尝试对完整 UTF 的大小写进行折换。
  • RTRIM - 与 BINARY 相同,除了尾随的空格将被忽略。

从 SQL 分配校对序列

每个表的每个列都有一个相关联的校对函数。如果没有校对函数被明确定义,校对规则默认为 BINARY。列定义的 COLLATE 子句被用来替代地为一个列定义校对函数。

为一个二元比较操作符(=、<、>、<=、>=、!=、IS 和 IS NOT)决定使用何种校对函数,按照下面展示的规则顺序进行:

  1. 如果两个操作数都使用 COLLATE 后缀操作符分配了一个明确的校对函数,那么明确的校对函数被用在比较中,左边操作数的校对函数有较高的优先级。
  2. 如果两个操作数都是一个列,左边列的校对函数有较高的优先级。前一句的目的是,带有一个或多个一元“+”操作符的列名仍被认为是一个列名。
  3. 否则,比较将会使用 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中文排序问题(网页)

    在SQLite中,我们可以创建一个自定义的Collation(排序规则)来处理中文排序。以下是一种简单的实现方式: 1. 创建自定义Collation: 在SQLite中,可以通过`CREATE COLLATION`语句定义一个新的排序规则。例如,...

    sqlite3.8.7源码

    2. `sqlite3ext.h`:这个头文件提供了SQLite的扩展机制,允许开发人员编写自定义的SQL函数、虚拟表模块或者Collation(排序规则)。通过`sqlite3_create_function_v2`等函数,可以将用户定义的C函数注册到SQLite,...

    SQLite Expert 非常好用的SQLite管理软件(含注册)

    SQLite Expert: A powerful ... 查看所有的功能和安装排序规则每个SQLite扩展! 在3.0的新功能:自定义的外观和感觉的应用程序使用外观。 在3.0的新功能:发送到打印机的网格任何内容或将其导出到一个PDF文件。

    sqlite资料

    可以结合WHERE子句进行条件筛选,GROUP BY和HAVING用于数据分组,ORDER BY进行排序,LIMIT和OFFSET用于结果限制。此外,还可以使用JOIN操作连接多个表,进行复杂的数据分析。 6. 视图与索引:视图是虚拟表,基于一...

    sqlite源码

    5. **B树索引**:SQLite使用B树作为索引结构,这使得快速查找和排序成为可能。源码中包含了B树节点的构建、遍历和维护算法。 6. **锁机制**:SQLite提供了多种锁级别(如共享锁、独占锁)来处理多用户并发访问。...

    英文版SQLite数据的参考资料

    8. **扩展功能**:如函数扩展、虚拟表模块、自定义Collations(排序规则)等,这些可以增强SQLite的功能和适应性。 9. **错误处理与调试**:如何理解和处理SQLite运行时的错误,以及使用日志和调试工具进行问题排查...

    sqlite文件读取工具 1.0.0.4版

    索引页则是按照特定排序规则存储键值,以加速查询性能。 在实际应用中,SQLite文件读取工具可以帮助进行故障排查、数据迁移、数据库审计等工作。例如,当数据库出现损坏时,可以借助此类工具尝试恢复丢失的数据。...

    SQLite_3_C中使用数据库.pdf

    其中,支持UTF-16编码格式和用户自定义文本排序规则显著增强了其国际化应用能力。同时,以索引列形式存储BLOB的能力提高了处理二进制大对象的效率。 ### SQLite API概览 SQLite提供了丰富的API,涵盖了数据库的...

    商业也免费的嵌入式数据库sqlite源码

    SQLite允许用户通过编写自定义的VFS(虚拟文件系统)、SQL函数、 collation sequence(排序规则)等来扩展其功能。开发者可以利用这些接口来定制特定的需求。 集成到.NET和Java: SQLite提供.NET和Java的绑定,...

    sqlite3 源码

    这个文件提供了一种机制,使得开发者可以编写自定义的SQL函数、虚拟表模块、 collation sequences(排序规则)等,以扩展SQLite3的功能。例如,通过实现`sqlite3_module`结构体,可以创建自定义的虚拟表模块,从而...

    sqlite3 mmicu icu fts cipher数据库代码及示例

    在SQLite3中集成MMICU ICU,可以增强对多语言文本的支持,使得数据库能够处理各种语言的数据,并提供正确的排序和比较规则。 FTS(Full-Text Search)是SQLite3的一个扩展,用于实现全文搜索引擎。它允许用户通过...

    [★★★★★]全面解析SQLite.pdf

    例如,它引入了新的文件格式以提高数据库的稳定性和性能,支持UTF-8和UTF-16字符编码,提供了用户定义的排序规则和列之间的亲和性,以及64位的行编号来支持更大规模的数据库操作。 然而,SQLite也有一些局限性。它...

    SQLiteManager+注册码

    3. **数据浏览**:以表格形式展示数据,支持排序、过滤和格式化,还可以直接编辑单元格内容,方便数据操作。 4. **数据库备份与恢复**:提供数据库备份和恢复功能,确保数据的安全。 5. **权限管理**:能够管理...

    SQlite数据库学习教程

    SQLite第三版中引入了用户定义的分类排序,允许开发者根据需要定义自己的分类规则。 64字节的行编号 SQLite第三版中引入了64字节的行编号,允许开发者使用更长的行编号。 改良的并发性 SQLite第三版中已经改良了...

    SQLite3_CC++_开发接口简介

    - **用户自定义文本排序方法**:可以根据特定需求定制排序规则。 - **对BLOB字段建立索引**:提高了对二进制大对象数据的查询效率。 为了实现这些特性,SQLite3采用了全新的数据库格式,确保了与旧版本之间的不兼容...

    sqlite3_sqlite3_sqlite_源码

    2. **读取(Read)**: `SELECT`语句用于查询数据,可以配合`WHERE`子句进行筛选,使用`ORDER BY`进行排序,`GROUP BY`进行分组,`JOIN`进行表间关联,`DISTINCT`去除重复项。 3. **更新(Update)**: `UPDATE`语句...

    android Sqlite城市编码表带city_num

    总的来说,"android Sqlite城市编码表带city_num"是一个针对Android应用的SQLite数据库,包含城市编码信息,`city_num`字段可能用于标识、排序或查询城市数据。理解和利用好这个资源,可以帮助开发者高效地处理地理...

    史上最强全面解析SQLite

    用户可以自定义排序规则,这对于处理非英语语言尤为重要。 ##### 64字节的行编号 为了支持更大的数据库,SQLite现在使用64字节的行编号。 ##### 改良的并发性 第三版在并发控制方面做出了改进,使得多个进程可以...

    SQLite数据库管理工具 SQLiteExpert免费官方正版

    SQLite可视化管理工具。...查看所有的功能和安装排序规则每个SQLite扩展! 3.0的新功能:自定义的外观和感觉的应用程序使用外观。 3.0的新功能:发送到打印机的网格任何内容或将其导出到一个PDF文件。

Global site tag (gtag.js) - Google Analytics