SQLite数据库中的列必须是COLLATE NOCASE。我假设没有办法将该功能添加到现有表中,所以我准备用它重新创建表。如何确定现有列是否为COLLATE NOCASE以避免每次打开时重新创建表?
如何确定现有列是否为COLLATE NOCASE
查询
SELECT sql FROM sqlite_master WHERE type='table' AND tbl_name='my_table'
会给你那张桌子的CREATE TABLE
声明。您可以检查DDL以确定该列是否已定义为COLLATE NOCASE
。
如果足以更改查询中的排序规则,则可能根本不需要这样做。我的意思是你可以在查询中覆盖它。它不会影响约束或索引,但根据您的使用情况,它可能已经足够好了。
需要明确的是:表定义中的collate子句只是查询的默认值。您可以在查询中覆盖它。
EG
WHERE column = 'term' COLLATE NOCASE
要么
ORDER BY column COLLATE NOCASE
然而,并不是说SQLite的LIKE
不尊重collate子句(而是使用pragma case_sensitive_like
)。
最简单和最通用的方法是在某处(在另一个表中,或使用PRAGMA user_version)存储版本号。
如果要检查列本身,请使用具有列的排序规则影响的比较的查询:
SELECT Col = upper(Col)
FROM (SELECT Col
FROM MyTable
WHERE 0 -- don't actually return any row from MyTable
UNION ALL
SELECT 'x' -- lowercase; same collation as Col
);