我知道有关此标题的问题已经回答过,但是请继续阅读。发布前,我已彻底阅读了关于此错误的所有其他问题/答案。
我收到以下查询的上述错误:
CREATE TABLE IF NOT EXISTS `pds_core_menu_items` (
`menu_id` varchar(32) NOT NULL,
`parent_menu_id` int(32) unsigned DEFAULT NULL,
`menu_name` varchar(255) DEFAULT NULL,
`menu_link` varchar(255) DEFAULT NULL,
`plugin` varchar(255) DEFAULT NULL,
`menu_type` int(1) DEFAULT NULL,
`extend` varchar(255) DEFAULT NULL,
`new_window` int(1) DEFAULT NULL,
`rank` int(100) DEFAULT NULL,
`hide` int(1) DEFAULT NULL,
`template_id` int(32) unsigned DEFAULT NULL,
`alias` varchar(255) DEFAULT NULL,
`layout` varchar(255) DEFAULT NULL,
PRIMARY KEY (`menu_id`),
KEY `index` (`parent_menu_id`,`menu_link`,`plugin`,`alias`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
有谁知道为什么以及如何解决它?问题是-相同的查询在我的本地计算机上运行完美,在我以前的主机上也运行良好。顺便说一句,它来自一个成熟的项目-
phpdevshell-所以我猜这些家伙知道他们在做什么,尽管你永远都不知道。
任何线索表示赞赏。
我正在使用phpMyAdmin。
正如@Devart所说,索引的总长度太长。
简短的答案是,无论如何您都不应该为如此长的VARCHAR列建立索引,因为索引将非常庞大且效率低下。
最佳实践是使用 前缀索引, 因此您仅索引数据的左子串。无论如何,您的大多数数据都会少于255个字符。
您可以在定义索引时为每列声明前缀长度。例如:
...
KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
...
但是给定列的最佳前缀长度是多少?这是一种找出方法:
SELECT
ROUND(SUM(LENGTH(`menu_link`)<10)*100/COUNT(`menu_link`),2) AS pct_length_10,
ROUND(SUM(LENGTH(`menu_link`)<20)*100/COUNT(`menu_link`),2) AS pct_length_20,
ROUND(SUM(LENGTH(`menu_link`)<50)*100/COUNT(`menu_link`),2) AS pct_length_50,
ROUND(SUM(LENGTH(`menu_link`)<100)*100/COUNT(`menu_link`),2) AS pct_length_100
FROM `pds_core_menu_items`;
它告诉您列中不超过给定字符串长度的行的比例menu_link
。您可能会看到如下输出:
+---------------+---------------+---------------+----------------+
| pct_length_10 | pct_length_20 | pct_length_50 | pct_length_100 |
+---------------+---------------+---------------+----------------+
| 21.78 | 80.20 | 100.00 | 100.00 |
+---------------+---------------+---------------+----------------+
这告诉您80%的字符串少于20个字符,并且所有字符串少于50个字符。因此,无需索引超过50的前缀长度,当然也无需索引255个字符的全长。
PS:INT(1)
和INT(32)
数据类型表示对MySQL的另一种误解。数字参数与存储或该列允许的值范围无关。
INT
始终为4个字节,并且始终允许从-2147483648到2147483647之间的值。数字参数与显示期间的填充值有关,除非您使用该ZEROFILL
选项,否则该参数无效。
问题内容: 当我执行以下命令时: 我收到此错误消息: 有关column1和column2的信息: 我认为只需要21个字节,而只需要501个字节。因此,总字节数是522,少于767。那么为什么收到错误消息? 问题答案: 在MySQL版本5.6(及更早版本)中,InnoDB表的前缀限制为767个字节。MyISAM表的长度为1,000字节。在MySQL 5.7及更高版本中,此限制已增加到3072字节。
问题内容: 我无法在上创建索引。 MySQL: 问题答案:
问题内容: 原因 我该怎么办? 这是我的数据库编码: 问题答案: 这仅仅是一个MySQL问题- MySQL具有不同的引擎-MyISAM,InnoDB,内存… MySQL对可用于在列上定义索引的空间量有不同的限制- MyISAM为1,000字节;对于InnoDB是767 。这些列的数据类型很重要- 例如,它是3倍,因此a上的索引将占用其中300个字节(因为100个字符* 3 = 300)。 为了在达
问题内容: 我正在使用Rails 2.3.5应用程序,在女巫中我有这个领域 而这个指数 当我尝试执行时: 我收到此错误,并且不太了解如何解决。 问题答案: 听起来好像默认排序规则使用UTF8字符集。 MySQL通过字节而不是字符来限制键的长度。由于MySQL使用的UTF8实现每个字符允许3个字节,因此UTF8列上键的最大长度是键长度(以字符为单位)的3倍(如果未明确指定,则键长度为字段的全长)。
在cmd中提交“php artisan migrate:fresh”后出现错误。 SQLSTATE[42000]:语法错误或访问冲突:1071指定的密钥太长;最大密钥长度为767字节(SQL:alter tableaddunique()
我是Laravel的新手,尝试使用Laravel MediablePackage,但它给了我一个迁移错误- [PDOException]SQLSTATE[42000]:语法错误或访问冲突:1071指定的密钥太长;最大密钥长度为1000字节“ 我在Laravel 5.4.36,其他网站上的解决方案是添加这个- 但我的项目中已经有了这个。 有人能帮忙吗?