数据库教程14:简要介绍下SQLite中在比较时使用的排序规则

1,339 阅读2分钟

这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战

SQLite是一种C语言库,它实现了一个小型,快速,自包含,高可靠性,功能齐全的SQL数据库引擎。构建在所有的手机和大多数计算机,或绑定在应用程序中。

作为一个自包含的单文件型的数据库,既能够使用SQL的语法和数据库系统的理论方便高效地管理存储数据,又能便携地随着应用移植到任何其他位置和平台,尤其在手机APP开发中应用非常广泛。SQLite目前最新版本为3.36.0。

排序规则介绍

作为关于字符集和排序规则的介绍,SQLite和PostgreSQL是唯二存在的默认排序规则(Collation)区分大小写的数据库。

SQLite比较字符串时,使用一个排序规则序列(collating sequence)或排序规则函数。内建的函数是: BINARY, NOCASE 和 RTRIM.

  • BINARY:使用的是二进制比较。
  • RTRIM:和 binary 相同,不过会忽略尾部的空白字符。
  • NOCASE:不区分大小写比较字符。

可以使用 sqlite3_create_collation() 注册额外的排序规则函数。

排序规则函数仅适用于比较字符串值。数字值总是比较数值大小;BLOB总是一个字节一个字节的比较。

SQLite中列的排序规则

每个表的每个列都有对应的排序规则函数。如果没有显式地定义,则默认为BINARY。

这就是为什么,SQLIte默认是区分大小写的。

可以通过COLLATE子句指定比较和排序时的排序规则。

COLLATE子句也可以在创建表时,定义在列上。

实际测试SQLite的排序规则

如下,进入SQLite,并创建OrderTest表,插入数据。

CREATE TABLE OrderTest(
  letter char(1) NOT NULL
);
INSERT INTO OrderTest values('B'),('b'),('A'),('a');
  • 查看默认的比较结果:
sqlite> select * from OrderTest where letter='a';
a
sqlite> select * from OrderTest where letter='A';
A
  • SQLite执行比较时不区分大小写:
sqlite> select * from OrderTest where letter collate nocase ='A';
A
a
  • SQLite中order by子句排序,默认的结果:
sqlite> select letter from OrderTest order by letter;
A
B
a
b
  • SQLite中order by子句排序时指定不区分大小写的排序规则NOCASE:
sqlite> select letter from OrderTest order by letter collate nocase;
A
a
B
b

使用upper()或lower()函数

SQLIte中同样支持 upper() 或 lower() 函数。

在进行字符串比较、排序和分组(Group by)时不区分大小写,除了排序规则的指定,还可以使用这两个函数。