我有一个dn
列,用于支持varchar(290)
。
现在它应该支持输入1024
个字符。
据我所知,我们有一个varchar限制,直到767
。
我尝试将变量类型更改为文本,但我收到以下错误:
mysql> ALTER TABLE `parent1` MODIFY column `dn` text;
ERROR 1170(42000):BLOB / TEXT列'dn'用于密钥规范 没有密钥长度
mysql> ALTER TABLE `parent1` MODIFY column `dn` text(1024);
ERROR 1170(42000):BLOB / TEXT列'dn'用于密钥规范 没有密钥长度
mysql> ALTER TABLE `parent1` MODIFY column `fdn` longtext(1024);
错误1064(42000):您的SQL语法有错误;检查 手册,对应右边的MySQL服务器版本 在第1行'(1024)'附近使用的语法
以下是索引:
> SHOW keys from parent1;
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Index_type | NULL |
| parent1 | 0 | PRIMARY | 1 | parent_id | A | 0 | NULL | NULL | BTREE | |
| parent1 | 0 | id_dn | 1 | id | A | 0 | NULL | NULL | BTREE |
| parent1 | 0 | id_fdn | 2 | dn | A | 0 | NULL | NULL | BTREE
答案 0 :(得分:1)
在5.0.3版本( long 之前)之后,MySQL开始支持VARCHAR(65535)
。 https://dev.mysql.com/doc/refman/5.6/en/char.html
(CHAR(255)
对于固定长度的字符串确实是限制。)
您提到的767值是允许的最长索引键前缀。也就是说,如果在类型为VARCHAR(768)
或更多的列上创建索引,则必须仅索引列的前缀。 https://dev.mysql.com/doc/refman/5.6/en/char.html。 text
(CLOB)列上的索引也是如此。
因此,当您在这样的长列上定义任何索引时,您需要将其定义为前缀。因此,如果您在表中有此列定义。
dn VARCHAR(8192)
你需要这个索引创建命令或类似的东西。
ALTER TABLE parent1 ADD INDEX id_fdn (dn(767));
要更改表以使该列更宽,首先应删除提及该列的任何索引,然后更改表,然后使用前缀重新创建索引。
没有必要从VARCHAR()
切换到TEXT
,实际上你不应该这样做,因为如果你这样做,检索会慢一点。
此外,进行这种架构更改足以让你可能希望在未来的表格中添加额外的字符。
所以,这样的事情可以帮到你。
ALTER TABLE parent1 DROP INDEX id_fdn;
ALTER TABLE parent1 MODIFY COLUMN dn VARCHAR(4096);
ALTER TABLE parent1 ADD INDEX id_fdn (dn(750));
前缀索引的搜索结果是什么?不多。搜索处理将使用尽可能多的索引,然后在必要时比较实际值。