如何将sqlite3数据库的排序规则更改为不区分大小写排序?
我对sqlite3数据库进行了查询,该数据库提供了排序后的数据。数据根据一列进行排序,该列是varchar列名。现在当我进行查询时如何将sqlite3数据库的排序规则更改为不区分大小写排序?,sql,sqlite,sql-order-by,case-insensitive,Sql,Sqlite,Sql Order By,Case Insensitive,我对sqlite3数据库进行了查询,该数据库提供了排序后的数据。数据根据一列进行排序,该列是varchar列名。现在当我进行查询时 select * from tableNames Order by Name; 它提供这样的数据 Pen Stapler pencil 意味着它正在考虑区分大小写的东西。我想要的方式如下 Pen pencil Stapler 那么,为了获得必要的结果,我应该在sqlite3数据库中进行哪些更改 相关的 SQLite讨论用户定义的排序
select * from tableNames Order by Name;
它提供这样的数据
Pen
Stapler
pencil
意味着它正在考虑区分大小写的东西。我想要的方式如下
Pen
pencil
Stapler
那么,为了获得必要的结果,我应该在sqlite3数据库中进行哪些更改
相关的
SQLite讨论用户定义的排序规则序列。具体来说,您可以使用COLLATE NOCASE来实现您的目标
他们举了一个例子:
CREATE TABLE t1(
a, -- default collation type BINARY
b COLLATE BINARY, -- default collation type BINARY
c COLLATE REVERSE, -- default collation type REVERSE
d COLLATE NOCASE -- default collation type NOCASE
);
请注意:
-使用NOCASE排序规则序列(即值)执行分组
-“abc”和“abc”放在同一组中。
从t1中选择计数*按d分组
select * from tableNames Order by lower(Name);
Michael van der Westhuizen在下面的评论中解释了为什么这不是一个好方法。我留下这个答案是为了保留他的评论,并作为对其他人的警告,这些人可能会有与我相同的“聪明”想法- 要对其进行不区分大小写的排序,可以使用ORDER BY Name COLLATE NOCASE在SQLite数据库中使用以下语句:
PRAGMA case_sensitive_like = false
这不是一个好主意-如果没有基于函数的索引,则按函数排序将导致性能和可伸缩性问题。请参阅上面Dror Harari的答案,以了解在sqlite3中执行此操作的正确方法。如果您使用基于lowerName的基于函数的索引的Oracle,这是可以的,但在本例中不是。COLLATE NOCASE是否适用于任何语言?如果不是,如果编译时不知道特定的语言,如何以不区分大小写的方式对文本字段进行排序?IIRC sqlite3本机是UTF-8,因此应该根据Unicode UTF-8规则进行排序。当然,这可能不是用户所期望的…@moodforaday:没有内置的NOCASE排序规则。您可以在应用程序中重新定义NOCASE排序规则,并根据当前系统/用户区域设置实现排序。只需将自定义排序规则命名为NOCASE。对于ASCII字符,区分大小写的like已为false,对于超出ASCII范围的unicode字符,默认情况下区分大小写。