【发布时间】:2018-03-04 02:23:47
【问题描述】:
SQLite 数据库中的列必须是 COLLATE NOCASE。我认为无法将该功能添加到现有表中,因此我准备使用它重新创建表。如何确定现有列是否为 COLLATE NOCASE 以避免每次打开表时都重新创建表?
【问题讨论】:
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 子句只是查询的默认值。您可以在查询中覆盖它。
例如
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
);
【讨论】: