BLOB / TEXT列'bestilling'用于密钥规范而没有密钥长度
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BLOB / TEXT列'bestilling'用于密钥规范而没有密钥长度相关的知识,希望对你有一定的参考价值。
我正在尝试建立一个订单系统,但我现在被困住了。在mysql tabel中,我在名为“bestillinger”的列中使用varchar(255),但它只能存储255个字符。所以我搜索了一下,并记得我可以使用longtext或只是文本,但现在当我尝试这样做时,我得到一个错误说:
#1170 - BLOB/TEXT column 'bestilling' used in key specification without a key length
我试图在这里和谷歌搜索,但我没有运气。
我的MySQL表是:
CREATE TABLE IF NOT EXISTS `bestillinger` (
`id` int(11) NOT NULL,
`bestilling` TEXT NOT NULL PRIMARY KEY,
`accepted` varchar(255) DEFAULT NULL,
UNIQUE KEY `id_bestilling` (`id`,`bestilling`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
我使用UNIQUE KEY因为我在php部分使用“ON DUPLICATE KEY UPDATE”。但是不要介意。
提前致谢。
您不能将文本设置为主键。 Mysql只能索引一些字符,而且类型文本可能太大而无法索引。
看看这里:
- http://www.mydigitallife.info/mysql-error-1170-42000-blobtext-column-used-in-key-specification-without-a-key-length/
- MySQL error: key specification without a key length
根据您上面的定义,以及下面这个答案中的冗长独白,我建议进行以下修订:
CREATE TABLE IF NOT EXISTS `bestillinger` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`bestilling` TEXT NOT NULL,
`hashcode` CHAR(32) AS (MD5(bestilling)),
`accepted` VARCHAR(255) DEFAULT NULL,
UNIQUE KEY `id_bestilling` (hashcode,bestilling(333))
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Specific to MySQL,单列索引键的默认最大长度为1000字节长(767 bytes for InnoDB tables,除非您设置了innodb_large_prefix)。相同的长度限制适用于任何索引键前缀(CHAR,VARCHAR,TEXT的前N个字符或BINARY,VARBINARY,BLOB的前N个字节)。注意字符与字节的区别;假设UTF-8字符集和每个字符最多3个字节,您可能会在TEXT或VARCHAR列上使用超过333个字符的列前缀索引达到此限制。在实践中,333对我来说往往是最好的。
Similarly in SQL Server,所有索引键列的最大总大小限制为900字节。
但是,这只会使用你的TEXT的第一个字符作为你的关键,明显的碰撞迫在眉睫。
在接受的答案中,建议使用FULLTEXT index。 FULLTEXT索引是专为文本搜索而设计的,它对INSERT / DELETE的性能不是很好,因为它在列记录的词汇表上维护了一个N-gram并存储了结果向量。如果每个操作都在where子句中使用文本搜索功能,那么这将起作用...但不适用于唯一索引。在'id'上还定义了主键和唯一键,这似乎是多余的,或者我错过了意图。
相反,我建议计算哈希。你是正确的指出有一个机会(生日悖论)会有一个哈希碰撞,所以单独的UNIQUE索引是不够的。如上所述,我们将它与列前缀索引结合起来,以使我们对唯一性有信心。
我收集你的ID列的意图是允许从其他表引用正确的外键。非常正确,但那将是这个表更有用的主键。同样,int(11)指的是列的显示宽度,而不是基础值。我还在'id'上放置了一个未签名的auto_increment,以澄清其对更大受众的角色。
这将我们带到上面提出的设计。
用这个
CREATE TABLE IF NOT EXISTS `bestillinger` (
`id` int(11) NOT NULL,
`bestilling` TEXT NOT NULL PRIMARY KEY,
`accepted` varchar(255) DEFAULT NULL,
UNIQUE KEY `id_bestilling` (`id`,`bestilling`(767))
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
767是处理blob /文本索引时mysql的限制
参考:http://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html
我认为以下示例将最好地解释这个问题。
我遇到了问题,因为我试图将文本字段设置为UNIQUE。我通过将电子邮件的数据类型(TEXT)更改为电子邮件(VARCHAR(254))来解决问题。
mysql> desc users;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| fname | varchar(50) | NO | | NULL | |
| lname | varchar(50) | NO | | NULL | |
| uname | varchar(20) | NO | | NULL | |
| email | text | NO | | NULL | |
| contact | bigint(12) | NO | | NULL | |
| profile_pic | text | NO | | NULL | |
| password | varchar(20) | NO | | admin | |
+-------------+-------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
mysql> ALTER TABLE users ADD UNIQUE(email);
ERROR 1170 (42000): BLOB/TEXT column 'email' used in key specification without a key length
mysql>
mysql> ALTER TABLE users MODIFY email VARCHAR(254);
Query OK, 9 rows affected (0.02 sec)
Records: 9 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE users ADD UNIQUE(email);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc users;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| fname | varchar(50) | NO | | NULL | |
| lname | varchar(50) | NO | | NULL | |
| uname | varchar(20) | NO | | NULL | |
| email | varchar(254) | YES | UNI | NULL | |
| contact | bigint(12) | NO | | NULL | |
| profile_pic | text | NO | | NULL | |
| password | varchar(20) | NO | | admin | |
+-------------+--------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
mysql>
enter image description here尝试使用varchar中的所有列长度。由于尺寸原因,不允许使用文字。
以上是关于BLOB / TEXT列'bestilling'用于密钥规范而没有密钥长度的主要内容,如果未能解决你的问题,请参考以下文章
MySQL:错误代码:1118 行大小太大(> 8126)。将某些列更改为 TEXT 或 BLOB
Mysql -- BLOB, TEXT, GEOMETRY or JSON column 'result' can't have a default value
1074, "Column length too big for column 'err_solution' (max = 21845); use BLOB or TEXT