Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql MyISAM唯一密钥在64字节处被切断,导致冲突_Mysql_Myisam_Unique Key_Mysql Error 1062_Unique Index - Fatal编程技术网

Mysql MyISAM唯一密钥在64字节处被切断,导致冲突

Mysql MyISAM唯一密钥在64字节处被切断,导致冲突,mysql,myisam,unique-key,mysql-error-1062,unique-index,Mysql,Myisam,Unique Key,Mysql Error 1062,Unique Index,我有一个MySQL表,它将URL存储为唯一键。我开始在我的键上产生冲突,因为键本身似乎只是任何url的前64个字节(或字符,如果您愿意,它是一个拉丁-1排序)。所以,如果一个url超过64个字符,并且我已经得到了一个类似的url,它就会抛出一个错误 例如: SELECT l.link_id FROM mydb.links l WHERE url = 'http://etonline.com/tv/108475_Charlie_Sheen_The_People_Have_Elected_Me_a

我有一个MySQL表,它将URL存储为唯一键。我开始在我的键上产生冲突,因为键本身似乎只是任何url的前64个字节(或字符,如果您愿意,它是一个拉丁-1排序)。所以,如果一个url超过64个字符,并且我已经得到了一个类似的url,它就会抛出一个错误

例如:

SELECT l.link_id FROM mydb.links l WHERE 
url = 'http://etonline.com/tv/108475_Charlie_Sheen_The_People_Have_Elected_Me_as_Their_Leader/index.html'
抛出此错误:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 
'http://etonline.com/tv/108475_Charlie_Sheen_The_People_Have_Elec' for key 'url'
MyISAM不是应该有1000字节的密钥长度吗

编辑:“创建表状态”调用中似乎没有列出前缀长度,如下所示:

CREATE TABLE `links` (
  `link_id` int(11) NOT NULL AUTO_INCREMENT,
  `url` varchar(500) NOT NULL,
  PRIMARY KEY (`link_id`),
  UNIQUE KEY `url` (`url`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
我尝试将一个设置为256,如下所示:

ALTER TABLE `mydb`.`links` 
DROP INDEX `url`, ADD UNIQUE INDEX `url` (`url`(256) ASC) ;
我得到了以下错误:

ERROR 1062: Duplicate entry '<...64-byte key...>' for key 'url'
SQL Statement:
ALTER TABLE `mydb`.`links` 
DROP INDEX `url`, ADD UNIQUE INDEX `url` (`url`(256) ASC)

ERROR: Error when running failback script. Details follow.

ERROR 1050: Table 'links' already exists
错误1062:键“url”的重复条目“”
SQL语句:
更改表“mydb”。“links”
删除索引'url',添加唯一索引'url'('url`(256)ASC)
错误:运行故障回复脚本时出错。详情如下。
错误1050:表“链接”已存在

我认为回退是因为我通过MySQL Workbench运行了ALTER表。

当您创建一个只使用前缀的索引(通过指定索引的长度)时,前缀最多可以是1000字节(请参阅)。用于查找索引的实际长度。

我认为错误消息仅显示前64个字符,但这并不意味着约束限制为64个字符


如果您的
SHOW CREATE TABLE
输出是准确的,则索引在所有500个字符上,并且您正在命中一个精确的副本。

在链接表上执行
SHOW CREATE TABLE
。索引的长度可能是64。我还看到这个错误被截断为64个字符,而它与主键的长度无关。(MySQL版本14.14发行版5.1.61)呸,这里也一样,这是我的心头负担。有一秒钟,我认为我的数据库出了问题。同意@Oswald所说的。官方文件说():
可以创建只使用列值的前导部分的索引,使用col_name(length)语法指定…
我遇到了同样的问题,但我找不到任何官方文件说,当类字符列的大小为gt 64且您尚未指定索引前缀长度时,它将索引前缀长度默认为64。