大部分資料庫在進行字串比較的時候,對大小寫是不敏感的。
但是,在SQLite中,對大小寫是敏感的。
假設表Test的結構和值如下:
_id |
name |
1 |
ABCDE |
2 |
abcde |
3 |
ABCde |
4 |
abCDE |
5 |
aaaaa |
6 |
bbbbb |
執行下面的SQL語句:
select * from test where name = 'Abcde';
結果是沒有查詢到任何記錄。
明顯地,SQLite在進行字串比較的時候,預設對大小寫是敏感的。
那麼SQLite怎麼區分大小寫查詢呢,以下是三種解決方案:
方案一:使用大小寫轉換函式LOWER、UPPER
1.select * from test where LOWER(name) = 'abcde';
2.select * from test where LOWER(name) = LOWER('ABCDE');
3.select * from test where LOWER(name) = LOWER('Abcde');
4.select * from test where LOWER(name) = LOWER('ABCde');
....
(1).select * from test where UPPER(name) = 'ABCDE';
(2).select * from test where UPPER(name) = UPPER('ABCDE');
(3).select * from test where UPPER(name) = UPPER('Abcde');
(4).select * from test where UPPER(name) = UPPER('ABCde');
.....
查詢到的記錄都如下:
1 |
ABCDE |
2 |
abcde |
3 |
ABCde |
4 |
abCDE |
方案二:在進行比較時強制聲明不區分大小寫
select * from test where name = 'ABCDE' COLLATE NOCASE;
查詢到的記錄如下:
1 |
ABCDE |
2 |
abcde |
3 |
ABCde |
4 |
abCDE |
方案三:建立表時聲明該欄位不區分大小寫
create table test (_id Integer,name Text COLLATE NOCASE );
如果在任何情況下都不需要對大小寫敏感,方案三是最好的解決方案;
如果只是少量查詢對大小寫不敏感,可以用方案二。
而方案一由於用到了函數,可能有額外的效能消耗,不推薦使用。