MYSQL ERROR 1071 (42000): Specified key was too long; max key length is 767 byte
drop table if exists test;
create table test(test varchar(767) primary key)charset=latin5; -- 成功
drop table if exists test;
create table test(test varchar(768) primary key)charset=latin5; -- 错误
-- ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
drop table if exists test;
create table test(test varchar(383) primary key)charset=GBK; -- 成功
drop table if exists test;
create table test(test varchar(384) primary key)charset=GBK; -- 错误
-- ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
drop table if exists test;
create table test(test varchar(255) primary key)charset=UTF8; -- 成功
drop table if exists test;
create table test(test varchar(256) primary key)charset=UTF8; -- 错误
-- ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
MySQL的varchar主键只支持不超过768个字节 或者 768/2=384个双字节 或者 768/3=256个三字节的字段 ,而 GBK是双字节的,UTF-8是三字节的。
MySQL ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes 的原因分析
查看mysql表结构的方法有三种:
1、mysql> desc tablename; # 查看表的结构
+------------------+---------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+---------------------+------+-----+---------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | text | NO | | NULL | |
| content | text | NO | | NULL | |
| ordering | int(11) | NO | | 0 | |
| position | varchar(50) | YES | | NULL | |
| checked_out | int(11) unsigned | NO | | 0 | |
| checked_out_time | datetime | NO | | 0000-00-00 00:00:00 | |
| published | tinyint(1) | NO | MUL | 0 | |
| module | varchar(50) | YES | MUL | NULL | |
| numnews | int(11) | NO | | 0 | |
| access | tinyint(3) unsigned | NO | | 0 | |
| showtitle | tinyint(3) unsigned | NO | | 1 | |
| params | text | NO | | NULL | |
| iscore | tinyint(4) | NO | | 0 | |
| client_id | tinyint(4) | NO | | 0 | |
| control | text | NO | | NULL | |
+------------------+---------------------+------+-----+---------------------+----------------+
2、mysql> show create table tablename; # 查看创建表的sql语句
- mysql> show create table jos_modules;
- jos_modules | CREATE TABLE `jos_modules` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `title` text NOT NULL,
- `content` text NOT NULL,
- `ordering` int(11) NOT NULL DEFAULT '0',
- `position` varchar(50) DEFAULT NULL,
- `checked_out` int(11) unsigned NOT NULL DEFAULT '0',
- `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
- `published` tinyint(1) NOT NULL DEFAULT '0',
- `module` varchar(50) DEFAULT NULL,
- `numnews` int(11) NOT NULL DEFAULT '0',
- `access` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `showtitle` tinyint(3) unsigned NOT NULL DEFAULT '1',
- `params` text NOT NULL,
- `iscore` tinyint(4) NOT NULL DEFAULT '0',
- `client_id` tinyint(4) NOT NULL DEFAULT '0',
- `control` text NOT NULL,
- PRIMARY KEY (`id`),
- KEY `published` (`published`,`access`),
- KEY `newsfeeds` (`module`,`published`)
- ) ENGINE=MyISAM AUTO_INCREMENT=145 DEFAULT CHARSET=utf8
3、mysql>select COLUMN_NAME from information_schema.COLUMNS where table_name = 'tablename' and TABLE_SCHEMA ='databasename';
# 查看列名
- +----------------------------+
- | COLUMN_NAME
- +----------------------------+
- | id
- | distinct_name
- | offical_domain
- | offical_ip
- | offical_ip_loc
- | similar_domain_regex
- | title_keywords
- | content_sensitive_keywords
- | out_link_offical_rate
- | icp_code
- | reserved_one
- | reserved_two
- | reserved_three
- | update_time
- +----------------------------+
|