mysql/mariadb - 创建表列索引不工作

标签 mysql mariadb

所以我正在尝试按如下方式创建我的表:

CREATE TABLE company
  (
    id INT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
    name TEXT UNIQUE NOT NULL,

    INDEX(name(20))
  );

它给我这个错误:

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

我不确定为什么它不起作用,因为我正在按照此处的指南操作:https://dev.mysql.com/doc/refman/5.5/en/column-indexes.html

最佳答案

您关注的是错误的行。

name TEXT UNIQUE NOT NULL,

BLOBTEXT 列上的索引必须是前缀索引,因此,不可能对 施加 UNIQUE 约束TEXT 列。您也不能将这样的列作为主键或外键约束的一部分。

两种常见的解决方案:

  1. 不要使用 TEXT 列,使用 VARCHAR

  2. 如果您确实需要一个长列是唯一的,请创建第二个 CHAR 类型的列,COLLATE ascii_bin,为其添加唯一约束,然后它的大小适合所选加密哈希 (md5, sha) 的 base64 表示。使用 BEFORE INSERTBEFORE UPDATE 触发器强制此列包含长列的哈希值,从而间接强制执行唯一性。数据类型 CHAR 因为所有散列的长度都相同,而 ascii_bin 因为这是最适合 base64 的排序规则。为什么是 base64?这是存储空间换取可读性的权衡,使用24个字符存储一个md5 hash,在存储空间上大约介于二进制(16个字符为md5,高效)和十六进制(32个字符为md5,低效)编码之间。

关于mysql/mariadb - 创建表列索引不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45625421/

相关文章:

mysql - 历史和当前规模

mysql - 按一列分组并计算 matlab 中各组的中位数

MySQL 默认字符集

MySQL/MariaDB 复制 : Can I interrupt the process?

mysql - 尝试在 mysql 中创建过程时出现 RECURSIVE 附近的语法错误

mysql - 在 MySQL 中创建存储过程

php - 在 PHP 中使用 VARBINARY 选择数据

mysql - 在 SQL 中显示较低值和较高值的数量

mysql - 如何使联合表在 MariaDB 重新启动之间保持不变?

QA 迁移到 Maria DB 后的 MYSQL,应用程序查询返回列结果集元数据的不同情况