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

文章目录

    今天在 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式