ERROR 1170 (42000): BLOB/TEXT column 'title' used in key specification without a key length

更新日期: 2021-11-05 阅读次数: 3830 字数: 265 分类: MySQL

今天在 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 聊聊, 查看更多联系方式