【问题标题】:MYSQL: How to make composite unique constraint case insensitiveMYSQL:如何使复合唯一约束不区分大小写
【发布时间】:2018-06-12 20:10:51
【问题描述】:

表格查询:

CREATE TABLE `TESTING_TABLE` (
   `ID` char(36) COLLATE utf8_bin NOT NULL,
   `NAME` char(36) COLLATE utf8_bin NOT NULL,
   `DISPLAY_NAME` varchar(128) COLLATE utf8_bin NOT NULL,
   UNIQUE KEY `DISPLAY_NAME_UK` (`NAME`,`DISPLAY_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

第一行插入:

INSERT INTO `TESTING_TABLE` (`ID`, `NAME`, `DISPLAY_NAME`) VALUES ('1', 'Foo', 'Bar');

第二行插入:

INSERT INTO `TESTING_TABLE` (`ID`, `NAME`, `DISPLAY_NAME`) VALUES ('2', 'Foo', 'bar');

由于我有 'DISPLAY_NAME_UK' 唯一约束,我希望第二行插入应该引发“重复条目”异常。但它允许 DISPLAY_NAME 列中区分大小写的值。如何让它不区分大小写?

【问题讨论】:

    标签: mysql case-sensitive unique-constraint unique-key


    【解决方案1】:

    将 utf8_bin 替换为 utf8_general_ci

    CREATE TABLE `TESTING_TABLE` (
    `ID` char(36) COLLATE utf8_bin NOT NULL,
    `NAME` char(36) COLLATE utf8_bin NOT NULL,
    `DISPLAY_NAME` varchar(128) COLLATE utf8_general_ci NOT NULL,
    UNIQUE KEY `DISPLAY_NAME_UK` (`NAME`,`DISPLAY_NAME`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    

    【讨论】:

      【解决方案2】:

      如果您希望将“bar”和“Bar”视为相同的值,这不是区分大小写,而是区分大小写不区分大小写

      最简单的方法可能是使用不区分大小写的排序规则,例如utf8mb4

      【讨论】:

      • 获取异常 - 错误代码:1273。未知排序规则:'utf8mb4'
      • utf8mb4 是字符集名称,而不是排序规则名称。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 2020-12-25
      • 1970-01-01
      • 2020-07-22
      • 2012-03-17
      • 1970-01-01
      • 2013-05-11
      相关资源
      最近更新 更多