【问题标题】:MyISAM unique keys being cut off at 64 bytes, causing collisionsMyISAM 唯一键在 64 字节处被截断,导致冲突
【发布时间】:2011-04-26 11:30:48
【问题描述】:

我有一个 MySQL 表,将 url 存储为唯一键。我开始在我的键上发生冲突,因为键本身似乎只是任何 url 的前 64 个字节(或者如果您愿意,它是一个 latin-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 STATUS 调用中似乎没有列出前缀长度,如下所示:

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

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

【问题讨论】:

  • 在你的链接表上做一个show create table。索引可能定义为长度为 64。

标签: mysql myisam unique-key mysql-error-1062 unique-index


【解决方案1】:

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

如果您的 SHOW CREATE TABLE 输出准确,则索引在所有 500 个字符上,并且您遇到了完全相同的重复项。

【讨论】:

  • 我还看到这个错误被截断为 64 个字符,而它与主键的长度无关。 (MySQL Ver 14.14 Distrib 5.1.61)
  • 唷,这里也一样,这让我很放心。有一秒钟我以为我的数据库搞砸了。
【解决方案2】:

当您创建仅使用前缀的索引(通过指定索引的长度)时,前缀可以最多 1000 个字节(请参阅7.5.1 Column Indexes)。使用SHOW CREATE TABLE找出索引的实际长度。

【讨论】:

  • 同意@Oswald 所说的。官方文档说 (link) :Indexes can be created that use only the leading part of column values, using col_name(length) syntax to specify an &lt;index prefix length&gt;... 我遇到了同样的问题,但是我找不到任何官方文档说当 chars-like 列的大小为 gt 64 时默认索引前缀长度为 64并且您还没有指定索引前缀长度。
猜你喜欢
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多