使唯一的键不敏感

时间:2013-04-01 05:20:02

标签: mysql sql database-design

这是我的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

5 个答案:

答案 0 :(得分:3)

最简单的方法是在DDL语句中添加BINARY

`NAME` varchar(128) BINARY NOT NULL

答案 1 :(得分:0)

如果您需要区分大小写:

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 

答案 2 :(得分:0)

默认情况下,只为您的数据库使用utf8_general_ci(不区分大小写)字符集,或者只为一行使用

答案 3 :(得分:0)

你可以这样做..

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

答案 4 :(得分:0)

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;

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

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