【问题标题】:How to determine if SQLite column created with COLLATE NOCASE如何确定 SQLite 列是否使用 COLLATE NOCASE 创建
【发布时间】:2018-03-04 02:23:47
【问题描述】:

SQLite 数据库中的列必须是 COLLATE NOCASE。我认为无法将该功能添加到现有表中,因此我准备使用它重新创建表。如何确定现有列是否为 COLLATE NOCASE 以避免每次打开表时都重新创建表?

【问题讨论】:

标签: sql sqlite


【解决方案1】:

如何确定现有列是否为 COLLATE NOCASE

查询

SELECT sql FROM sqlite_master WHERE type='table' AND tbl_name='my_table'

将为您提供该表的CREATE TABLE 语句。您可以检查 DDL 以确定该列是否已定义为 COLLATE NOCASE

【讨论】:

  • 感谢 Gord - 这是我正在寻找的信息。我可以快速确定是否需要更改 MyTable。如果是这样,我使用 SQLite 创建一个带有所需 NOCASE 的 TempTable;插入临时表 SELECT * FROM MyTable;删除表我的表;最后是“ALTER TABLE TempTable 重命名为 MyTable”;非常快:)
【解决方案2】:

如果更改查询中的排序规则就足够了,您可能根本不需要这样做。我的意思是你可以在查询中覆盖它。它不会影响约束或索引,但根据您的用例,它可能就足够了。

需要明确:表定义中的 collat​​e 子句只是查询的默认值。您可以在查询中覆盖它。

例如

 WHERE column = 'term' COLLATE NOCASE

 ORDER BY column COLLATE NOCASE

但是,并不是说 SQLite 的 LIKE 不支持 collat​​e 子句(改用 pragma case_sensitive_like)。

【讨论】:

    【解决方案3】:

    最简单和最通用的方法是将版本号存储在某处(在另一个表中,或使用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
         );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 2017-12-10
      • 2018-02-25
      • 2012-06-27
      • 2010-09-14
      • 2010-10-22
      相关资源
      最近更新 更多