string比较时如何设置Sqlite3不区分大小写?

我想通过string匹配从sqlite3数据库中selectlogging。 但是如果在where子句中使用'=',我发现sqlite3区分大小写。 谁能告诉我如何使用string比较不区分大小写?

你可以在你的SELECT查询中使用COLLATE NOCASE

 SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE 

另外,在SQLite中,通过在列定义中指定collate nocase (其他选项是binary (默认值)和rtrim ;请参阅此处 )创build表时,可以指示列应该不区分大小写。 您也可以在创build索引时指定collate nocase 。 例如:

创build表testing
 (
   Text_Value文本整理nocase
 );

插入testing值('A');
插入testing值('b');
插入testing值('C');

创build索引Test_Text_Value_Index
  在testing(Text_Value collat​​e nocase);

涉及Test.Text_Valueexpression式现在应该不区分大小写。 例如:

 sqlite>从testing中selectText_Value其中Text_Value ='B';
 TEXT_VALUE      
 ----------------
 b               

 sqlite>从Test order by Text_Value中selectText_Value;
 TEXT_VALUE      
 ----------------
一个               
 b               
 C    

 sqlite>从Test order by Text_Value desc中selectText_Value;
 TEXT_VALUE      
 ----------------
 C               
 b               
一个               

优化程序还可以使用该索引进行不区分大小写的search和匹配。 你可以使用explain SQL命令来检查它,例如:

 sqlite>解释从Test中selectText_Value其中Text_Value ='b';
 addr操作码p1 p2 p3                               
 ---------------- -------------- ---------- ---------- ---------------------------------
 0转到0 16                                           
 1整数0 0                                            
 2 Openinfo 1 3 keyinfo(1,NOCASE)                
 3 SetNumColumns 1 2                                            
 4 String8 0 0 b                                
 5 IsNull -1 14                                           
 6 MakeRecord 1 0 a                                
 7 MemStore 0 0                                            
 8 MoveGe 1 14                                           
 9 MemLoad 0 0                                            
 10 IdxGE 1 14 +                                
 11第1栏                                            
 12callback1 0                                            
 13下一页1 9                                            
 14closures1 0                                            
 15停止0 0                                            
 16交易0 0                                            
 17 VerifyCookie 0 4                                            
 18转到0 1                                            
 19 Noop 0 0                                            
 SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE 

你可以这样做:

 SELECT * FROM ... WHERE name LIKE 'someone' 

(这不是解决scheme,但在某些情况下非常方便)

LIKE运算符进行模式匹配比较,右边的操作数包含模式,左边的操作数包含匹配模式的string,模式中的百分号(”%“)匹配零或更多string中的下划线(“_”)与string中的任何单个字符相匹配,任何其他字符与 自身 匹配, 或者 大小写 相当(即不区分大小写的 匹配) (一个bug:SQLite只能理解例如,expression式'a'LIKE'A'为TRUE,但'æ'LIKE'Æ'为FALSE。)对于超出ASCII范围的unicode字符,LIKE运算符是区分大小写的。 “。

这不是特定于sqlite,但你可以做

 SELECT * FROM ... WHERE UPPER(name) = UPPER('someone') 

另一种select是创build自己的自定义sorting规则。 然后,您可以在该列上设置该sorting规则,或者将其添加到您的select子句中。 它将用于sorting和比较。

这可以用来使'VOILA'像'voilà'。

http://www.sqlite.org/capi3ref.html#sqlite3_create_collat​​ion

如果第一个string分别小于,等于或大于第二个string,则整理函数必须返回一个负数,零或正的整数。

另一个select可能会或可能没有意义,在您的情况下,实际上有一个单独的列与现有的列pre-lowererscored值。 这可以使用SQLite函数LOWER()来填充,然后您可以在该列上执行匹配。

显然,它增加了冗余性和潜在的不一致性,但是如果你的数据是静态的,它可能是一个合适的select。

如果这个列的types是char那么你需要把你正在查询的值加上空格,请参考这个问题。 这除了使用COLLATE NOCASE或其他解决scheme之一(上()等)。

您可以使用类似的查询来比较各个string与表值。

从table_name中select列名称,其中列名称为“各自的比较值”;

它为我工作完美。 SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE