【问题标题】:How to make a case-insensitive unique column in SQLite如何在 SQLite 中创建不区分大小写的唯一列
【发布时间】:2014-01-21 18:57:12
【问题描述】:

我无法找到这个问题的答案。我正在尝试创建一个具有唯一电子邮件地址列的表。当我这样做时

CREATE TABLE users (
  email TEXT PRIMARY KEY,
  password TEXT NOT NULL CHECK(password<>''),
  UNIQUE (lower(email))
)

使用 PDO 时出现错误:

致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[HY000]:一般错误:1 附近的“(”:script.php 中的语法错误:65 堆栈跟踪:#0 script.php(65):PDO ->exec('CREATE TABLE us...') #1 {main} 在第 65 行的 script.php 中抛出

第 65 行是 CREATE TABLE 行。如果我取出UNIQUE,它可以正常工作。有更好的方法吗?

【问题讨论】:

    标签: sqlite pdo


    【解决方案1】:

    COLLATE NOCASE是你的朋友:

    CREATE TABLE users (
      email TEXT PRIMARY KEY,
      password TEXT NOT NULL CHECK(password<>''),
      UNIQUE (email COLLATE NOCASE)
    )
    

    【讨论】:

    • 抱歉,如果您发现它无关紧要,但已经创建了一个独特的列,当用户输入现有数据并显示 toast 时如何捕捉这种情况?
    【解决方案2】:

    为了速度,首先将所有输入设为小写,然后使用普通的唯一列。

    这对于读多于写的用例非常有用,因为查询只需要比较字符串,而不是首先转换必须多次比较的字段。

    【讨论】:

    • 最好在数据库中执行而不是在执行输入的客户端中执行,因为您无法始终确定数据的来源,例如从外部来源。
    • Alec Teal,您声称这是为了提高速度,但您是否对此进行了基准测试?我做到了。案例 A 存储原始文本和带有小写文本的单独派生字段(小写字段的唯一约束)。案例 B 仅使用 COLLATE NOCASE 存储原始和使用的唯一约束。对于案例 A,插入速度比案例 B 慢 5-8%(更多数据),搜索速度比案例 B 慢 15-20%,排序也差不多。
    • "搜索速度比案例 B 慢 15-20%" 您是否也将 COLLATE NOCASE 添加到 where 条件?
    • @DanieleRicci 85% 的统计数据已经完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2013-03-06
    • 2012-12-26
    • 1970-01-01
    • 2012-01-31
    • 2013-03-22
    • 1970-01-01
    相关资源
    最近更新 更多