今天在 MySQL 中建表时,报错
ERROR 1170 (42000): BLOB/TEXT column 'title' used in key specification without a key length
从错误信息字面上看,是 text 类型作为唯一索引时,必须指定长度。
出错的建表 SQL
CREATE TABLE `question` (
`id` INT NOT NULL AUTO_INCREMENT,
`title` TEXT NULL,
`answers` VARCHAR(255) NULL,
`created_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE INDEX `title_UNIQUE` (`title` ASC) VISIBLE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4;
合理的做法
一种是指定 key 的长度,如下面的 SQL。但这样确实存在不严谨的问题,例如,title 字段前面的字符都一样,只有后面几个字符不一样。
所以,更合理的做法是:
即第二种做法,对 title 做 hash,例如 md5,将 md5 作为唯一索引。
由于我这是个给别人开发的小系统,不太需要严格校验,所以直接偷懒用第一种做法了。
正确的建表 SQL
CREATE TABLE `question` (
`id` INT NOT NULL AUTO_INCREMENT,
`title` TEXT NULL,
`answers` VARCHAR(255) NULL,
`created_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE INDEX `title_UNIQUE` (`title`(767) ASC) VISIBLE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4;
参考
https://stackoverflow.com/questions/13710170/blob-text-column-bestilling-used-in-key-specification-without-a-key-length
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式