【问题标题】:Making unique key case insensitive使唯一键不区分大小写
【发布时间】:2013-03-22 04:57:54
【问题描述】:

这是我的 mysql 表架构,我使用的是 mysql 5

--
-- Table structure for table `DATA_USER_ROLE`
--

DROP TABLE IF EXISTS `DATA_USER_ROLE`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `DATA_USER_ROLE` (
  `ID` int(11) NOT NULL,
  `NAME` varchar(128) NOT NULL,
  `VAL_ID` int(11) NOT NULL,
  `CREATION_TIME` datetime NOT NULL,
  `ROLE_TYPE` int(11) NOT NULL,
  `STORAGE_TYPE` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `BV_AC_ROLE_KEY_IDX` (`NAME`,`VAL_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

需要 UNIQUE KEY 区分大小写,

应该允许输入像('a',0) & ('A', 0)这样的值

尝试将排序规则更改为 latin_1 和 latin_generic_ci

【问题讨论】:

    标签: mysql sql database-design


    【解决方案1】:

    最简单的就是在DDL语句上加上BINARY

    `NAME` varchar(128) BINARY NOT NULL
    

    【讨论】:

    • @J W:我将 NAME aatribute 的排序规则更改为 utf8_bin。我正在使用 SQLYOG。也有同样的问题。
    • 添加BINARY怎么样?同样的问题是什么意思?
    • 如何解决这个问题?它甚至没有使用UNIQUE约束
    【解决方案2】:

    如果您需要区分大小写:

    ALTER TABLE `DATA_USER_ROLE` CHANGE `NAME` `NAME` VARCHAR( 128 )
    CHARACTER SET latin1 COLLATE latin1_bin NULL DEFAULT NULL 
    

    如果您需要不区分大小写:

    ALTER TABLE `DATA_USER_ROLE` CHANGE `NAME` `NAME` VARCHAR( 128 )
    CHARACTER SET latin1 COLLATE latin1_general_ci NULL DEFAULT NULL 
    

    【讨论】:

    • 无论如何,如果有更多解释,这个答案会更有帮助。
    【解决方案3】:

    默认情况下,只需为您的数据库使用 utf8_general_ci(不区分大小写)字符集,如果需要,也可以仅用于一行

    【讨论】:

      【解决方案4】:

      你可以这样做..

      create table testTable (col_name varchar(100) character set utf8 
      collate utf8_bin not null ) Engine=innodb default charset=utf8 
      

      【讨论】:

        【解决方案5】:

        可以在整个表格上添加不区分大小写的COLLATE,即表格中的每个文本列,例如

        CREATE TABLE `DATA_USER_ROLE` (
          `ID` int(11) NOT NULL,
          `NAME` varchar(128) NOT NULL,
          `VAL_ID` int(11) NOT NULL,
          `CREATION_TIME` datetime NOT NULL,
          `ROLE_TYPE` int(11) NOT NULL,
          `STORAGE_TYPE` int(11) NOT NULL,
          PRIMARY KEY (`ID`),
          UNIQUE KEY `BV_AC_ROLE_KEY_IDX` (`NAME`,`VAL_ID`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
        

        在这种情况下,COLLATE 末尾的_ci 代表case insensitive

        这遵循 Monolune 对 https://www.monolune.com/mysql-utf8-charsets-and-collations-explained/
        https://www.monolune.com/what-is-the-utf8mb4_0900_ai_ci-collation/ 的 CHARSET 和 COLLATE 的建议

        这些是自 MySQL 8.0.1 以来的默认值。

        【讨论】:

          猜你喜欢
          • 2012-06-15
          • 1970-01-01
          • 2012-01-31
          • 1970-01-01
          • 2016-02-17
          • 2017-04-15
          • 1970-01-01
          • 2021-07-11
          • 2010-10-03
          相关资源
          最近更新 更多