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排序规则相关推荐

  1. mysql字符集编码和排序规则

    环境: mysql 5.7 26 DBeaver 21.1.2.202107041908 参考:<MySQL字符集与排序规则总结> 建议先阅读:<细说ASCII.GB2312/GBK ...

  2. 安装VCenter提示数据库排序规则有问题

    安装VCenter提示数据库排序规则有问题 有时候在安装sql server 数据库时你如果修改了排序规则,那么在安装VCenter时它会提示你的数据库排序规则有问题,不让你安装.这个时候你去修改一下 ...

  3. sont表示元素在存入集合时进行了排序,数据遍历的结果是按某个排序规则输出的

    单选 sont表示元素在存入集合时进行了排序,数据遍历的结果是按某个排序规则输出的;而order表示每次遍历的序列都是一样的,元素前后关系每次遍历都是确定的,那么下列哪些集合既是sort,又是orde ...

  4. 无法解决 equal to 操作中 SQL_Latin1_General_CP1_CI_AS 和 Chinese_PRC_CI_AS 之间的排序规则冲突。...

    一个旧有系统需要从另一个新系统获取数据.由于两个系统数据库的的排序规规则不同.在存储过程中SELECT数据时,引发了"无法解决 equal to 操作中 "SQL_Latin1_G ...

  5. BCH到底该采用哪种交易排序规则?

    ​​目前BCH在选取哪种交易排序方面依旧没有达成共识.其实针对BCH到底该采用什么交易排序规则这一问题完全可以通过分析对比进行决定. 针对这个问题应该分几个步骤进行思考. 1.目前的TTOR需不需要被 ...

  6. CTOR对比Gavin提出的交易排序规则

    ​​通过对CTOR的了解,我们已经知道它有很多优于TTOR的地方.尤其在解决未来BCH扩容中块传播的瓶颈中发挥着重要的作用.由于TTOR是中本聪提出的技术,而CTOR则需要改变共识,因此并不是所有的人 ...

  7. 在等于操作中无法解决“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CI_AS”之间的排序规则冲突

    本文翻译自:Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and &qu ...

  8. MSSQL 修改数据库的排序规则

    1.修改数据库排序规则 ALTER DATABASE [CHARACTER] COLLATE Chinese_PRC_CI_AS ; 2.修改表中列的排序规则 如果下列其中之一当前正在引用一个列,则无 ...

  9. 无法解决 equal to 操作中 Chinese_PRC_CI_AS_WS 和 Chinese_PRC_CI_AS 之间的排序规则冲突...

    本来好好的,电脑重装了一下居然碰到了这个问题.百度后知道了原因.记录一下 是因为两个表字段的排序规则不同导致的,于是找了很久,最后才发现原来是创建的临时表造成的. 解决方案如下: CREATE TAB ...

最新文章

  1. 想学单片机怎么入手?学单片机前先学什么?
  2. Python Django URL逆向解析(通过Python代码逆向访问)代码示例
  3. java平均差_如何做好描述统计分析
  4. zabbix 搭建笔记
  5. 编写程序,对用户输入的n个整数,统计其最大数、最小数和平均值
  6. Spring4.2+quartz2.2集群
  7. simulink仿真实例_又见Simulink库模型之(9):自定义函数
  8. Mapbar 地图 API 概念   技术文档
  9. HDU 1693 Eat the Trees ——插头DP
  10. Dijkstra算法(朴素,堆优化)+例题
  11. Why bugs don’t get fixed? 不是所有的Bug都要修复
  12. Python笔记3:使用命令行运行Python文件
  13. poi填充word,动态生成表格+LibreOffice转成pdf
  14. 计算机配机方案和理由,配机方案
  15. 1074 Reversing Linked List
  16. 惠普服务器优盘安装系统蓝屏,惠普u盘装系统出现蓝屏现象怎么解决
  17. 《英语语法新思维初级教程——走近语法》阅读笔记(持续更新中)
  18. 概率论—期末复习速成笔记(自用)
  19. 链游玩家出品:链游市场现状
  20. win+r常用组合键大全

热门文章

  1. 神经网络-反向传播算法
  2. Java虚拟机层面的几种锁
  3. 个人管理 - Learn More,Study Less!
  4. NOIP2015DAY2T2子串
  5. MongoDB 数据迁移 备份 导入(自用)
  6. ALL-TAG推出RFID墨水防损标签
  7. android内存优化发展——使用软引用
  8. 使用复制存储过程执行解决“事务复制中的表大量更新导致无法及时同步”的问题 (转)...
  9. 分析器错误信息: 未能加载类型命名空间.类...
  10. 点击调试时提示MFC不包含调试信息