所以我正在尝试按如下方式创建我的表:
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,
BLOB
和 TEXT
列上的索引必须是前缀索引,因此,不可能对 施加
列。您也不能将这样的列作为主键或外键约束的一部分。UNIQUE
约束TEXT
两种常见的解决方案:
不要使用
TEXT
列,使用VARCHAR
。如果您确实需要一个长列是唯一的,请创建第二个
CHAR
类型的列,COLLATE ascii_bin
,为其添加唯一约束,然后它的大小适合所选加密哈希 (md5, sha) 的 base64 表示。使用BEFORE INSERT
和BEFORE UPDATE
触发器强制此列包含长列的哈希值,从而间接强制执行唯一性。数据类型CHAR
因为所有散列的长度都相同,而ascii_bin
因为这是最适合 base64 的排序规则。为什么是 base64?这是存储空间换取可读性的权衡,使用24个字符存储一个md5 hash,在存储空间上大约介于二进制(16个字符为md5,高效)和十六进制(32个字符为md5,低效)编码之间。
关于mysql/mariadb - 创建表列索引不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45625421/