【问题标题】:SQL unique varchar case sensitivity questionSQL唯一varchar区分大小写问题
【发布时间】:2011-09-20 21:16:55
【问题描述】:

我正在尝试使用单词列表填充 SQL 表。表格本身很简单:

CREATE TABLE WORDS(
  ID BIGINT AUTO_INCREMENT, 
  WORD VARCHAR(128) NOT NULL UNIQUE, 
  PRIMARY KEY(ID)
);

我遇到的问题是:当我执行以下背靠背插入操作时

INSERT INTO WORDS(WORD) VALUES('Seth');
INSERT INTO WORDS(WORD) VALUES('seth');

第二次插入因违反约束而失败(“Duplicate entry 'seth' for key 'WORD'”)。

如何使WORD 上的UNIQUE 约束区分大小写?

【问题讨论】:

    标签: mysql sql case-sensitive varchar unique-constraint


    【解决方案1】:

    好像mysql是case insensitive by default:

    您可能需要使用区分大小写的排序规则(例如 utf8_bin)创建列:

    CREATE TABLE WORDS (
        ID BIGINT AUTO_INCREMENT, 
        WORD VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL UNIQUE, 
        PRIMARY KEY(ID)
    );
    

    【讨论】:

    • 做到了。谢谢。对于以后发现这个问题的人,我不得不使用 'utf8_bin' 排序规则,因为 mysql 没有 'utf8_cs'。
    • 感谢@Seth,这与比尔的信息一起很有帮助,utf8_bin 也适用于我的情况
    • #1273 - 未知排序规则:'utf8_cs'
    • 对 mysql 非常失望 :-( "Seth" 和 "seth" 不是同一个字符串!感谢您的帮助。
    • utf8_cs 的情况下使用 utf8_bin
    【解决方案2】:

    默认情况下,MySQL 会忽略 varchar 上大小写和尾随空格的差异。

    如果需要区分大小写,可以将表格更改为varchar(...) binary

    使用show create table 更好地了解 MySQL 如何将其转换为完整符号。

    如果您需要注意尾随空格以及区分大小写,请使用varbinary 而不是varchar

    【讨论】:

      【解决方案3】:

      试试这个:

      ALTER TABLE WORDS CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
      

      【讨论】:

        【解决方案4】:

        我创建了我的唯一键 varchar(1000)。它奏效了。

        经过反复试验,我发现任何大于或等于 1100 的 varchar 都会失败。

        澄清一下,我没有在 1001 到 1099 之间尝试。

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-23
          • 2016-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-31
          • 2013-03-22
          • 1970-01-01
          相关资源
          最近更新 更多