【问题标题】:MySQL unique 1500 varchar field error (#1071 - Specified key was too long)MySQL unique 1500 varchar field error (#1071 - Specified key was too long)
【发布时间】:2014-02-25 09:15:46
【问题描述】:

我有一个字段(链接),它是 varchar (1500),我想使其独一无二。我将更改应用到 mysql 配置并将长度增加到 3072 字节

ROW_FORMAT=DYNAMIC, innodb_file_format = Barracuda, innodb_large_prefix = true

但是当我对我的领域应用 unique 时,我得到了下一个错误:

"#1071 - Specified key was too long; max key length is 3072 bytes"

我的字段是 varchar(1500),即 3000 字节。

怎么了?

更新 (1) 表格数据:

CREATE TABLE IF NOT EXISTS `pages` (
  `link` varchar(1500) NOT NULL,
  `domain` varchar(255) NOT NULL,
  `lastvisited` datetime DEFAULT NULL,
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
  KEY `link` (`link`(255))
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ROW_FORMAT=DYNAMIC;

更新 (2) 更改命令(通过 PHPMYADMIN 完成)

ALTER TABLE  `pages` ADD UNIQUE (
`link`
)

【问题讨论】:

  • character set of table and column 是什么?
  • utf8.我更新了问题。
  • 如果您使用 UTF-8,每个字符可以是 3 个字节 - 即 4500 个字节,超过了最大密钥长度。我建议无论如何,这么长的钥匙充其量是笨拙的。
  • 如果您想在其中插入一个长字符串,您可以将您的列link 设为TEXT
  • @Tigran:您的CREATE 语句没有显示您在问题中谈到的UNIQUE 约束,只是一个非唯一的KEY

标签: mysql


【解决方案1】:

由于您将在 link 列中存储 URL,因此您实际上不需要使用 UTF8,因为 URL 只能包含 ASCII 字符。为 link 列指定纯 ASCII 字符编码甚至可以将其最大长度提高到 3072 个字符。

CREATE TABLE IF NOT EXISTS `pages` (
  `link` varchar(1500) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
  `domain` varchar(255) NOT NULL,
  `lastvisited` datetime DEFAULT NULL,
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
  UNIQUE KEY `link` (`link`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ROW_FORMAT=DYNAMIC;

(根据@eggyal 对ascii_bin 排序规则的建议进行了更新)

【讨论】:

  • +1 我正要以完全相同的答案点击“发布”,尽管建议每个 What is the maximum length of a URL in different browsers? 限制为 2000 个字符另外,我建议为该列指定 ascii_bin 排序规则,因为 URL 路径可能区分大小写。
  • 您确定“URL 只能包含 ASCII 字符”。俄罗斯和中国区域呢?据我所知,他们在域名中使用了非 ASCII 符号。
  • @Tigran:URL 中的非 ASCII 字符需要进行百分比编码。参考:RFC 3986
  • @lanzz:更明确地说,它们必须在路径中进行百分比编码,或者在主机名中进行 Puncycode 编码:但是无论它们放在哪里,大多数浏览器都会在“幕后”执行编码,而向用户显示非 ASCII 字符。
  • 我的解决方案有问题,当我创建表时,我收到 #1709 - 索引列大小太大的错误。最大列大小为 767 字节。但是,如果我创建初始表错误是“#1071 - Specified key was too long; max key length is 3072 bytes”。
猜你喜欢
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 2018-12-12
  • 2019-04-09
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多