【MySql】mysql 字段个数的限制-阿里云开发者社区

开发者社区> 北在南方> 正文

【MySql】mysql 字段个数的限制

简介:
+关注继续查看
看到itpub 论坛上有关于mysql数据库表中字段个数的讨论 ,讨论mysql字段个数限制在2559个!
自己做了测试,个数对存储引擎不同而不同!innodb 创建到第1001个时会报  Can't create table 'yang.#sql-c6d_421' (errno: 139)的错误!
下面是测试过程~
mysql> select version();
+------------+
| version()  |
+------------+
| 5.5.18-log |
+------------+
1 row in set (0.01 sec)
mysql> use test;
Database changed
情景一:innodb 存储引擎的表!
mysql> show create table yql2 \G;
*************************** 1. row ***************************
       Table: yql2
Create Table: CREATE TABLE `yql2` (
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ERROR: 
No query specified
mysql> EXIT
Bye
使用脚本如下:
[root@rac3 sh]# cat check_mysql_tab_col_num.sh 
#!/bin/sh
x=1
while [ $x -le 3000 ]
do
mysql -uroot  -Dtest << EOF >> /root/sh/add_col_log_innodb.log
alter table yql2 add column f$x char(1);
EOF
x=`expr $x + 1`
echo "第 $x 个字段"
done
~          
[root@rac3 sh]# sh mysql_tab_col_num.sh 
第 2 个字段
第 3 个字段
第 4 个字段       
...
第 999 个字段
第 1000 个字段
ERROR 1005 (HY000) at line 1: Can't create table 'yang.#sql-c6d_421' (errno: 139)
执行 到第 1000个字段出错!Can't create table 'yang.#sql-c6d_421' (errno: 139) 
注意:错误不是“ERROR 1117 (HY000) at line 1: Too many columns”!

Innodb的限制可以看到。

#A table cannot contain more than 1000 columns.

#The internal maximum key length is 3500 bytes, but MySQL itself restricts this to 1024 bytes.

#The maximum row length, except for VARCHAR, BLOB and TEXT columns, is slightly less than half of a database page. That is, the maximum row length is about 8000 bytes.LONGBLOB and LONGTEXT columns must be less than 4GB, and the total row length, including also BLOB and TEXT columns, must be less than 4GB. InnoDB stores the first 768 bytes of a VARCHAR, BLOB, or TEXT column in the row, and the rest into separate pages.

#Although InnoDB supports row sizes larger than 65535 internally, you cannot define a row containing VARCHAR columns with a combined size larger than 65535:


二 myisam 存储引擎的表
mysql> show create table tab2 \G;
*************************** 1. row ***************************
       Table: tab2
Create Table: CREATE TABLE `tab1` (
  `tid` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> desc tab2;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| tid   | int(10) | NO   | PRI | NULL    |                |
+-------+---------+------+-----+---------+----------------+
1 rows in set (0.00 sec)
[root@rac3 sh]# vim check_mysql_tab_col_num.sh 
#!/bin/sh
x=1
while [ $x -le 3000 ]
do
mysql -uroot  -Dtest << EOF >> /root/sh/add_col_log_myisam.log
alter table tab2 add column f$x char(1);
EOF
x=`expr $x + 1`
echo "第 $x 个字段"
done
[root@rac3 sh]# sh check_mysql_tab_col_num.sh
第 2 个字段
第 3 个字段
......
第 2598 个字段
第 2599 个字段
ERROR 1117 (HY000) at line 1: Too many columns
查看表结构:
mysql> desc yql19;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| tid   | int(10) | NO   |     | NULL    |       |
| f1    | char(1) | YES  |     | NULL    |       |
| f2    | char(1) | YES  |     | NULL    |       |
| f3    | char(1) | YES  |     | NULL    |       |
| f4    | char(1) | YES  |     | NULL    |       |
| f5    | char(1) | YES  |     | NULL    |       |
.....
| f2596 | char(1) | YES  |     | NULL    |       |
| f2597 | char(1) | YES  |     | NULL    |       |
| f2598 | char(1) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2599 rows in set (0.08 sec)
共2599 个字段!

可以参考关于innodb 表物理上存储知识的另一篇文章:innodb没有overflow segment

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
开发限制—SQL概述
本文简单介绍了PolarDB-X语法及操作。
15 0
MySQL添加字段和修改字段的方法
添加表字段 alter table table1 add transactor varchar(10) not Null; alter table   table1 add id int unsigned not Null auto_increment primary key 修改某个表的字段...
629 0
SQL更新部分字段或者插入新数据
SQL更新部分字段或者插入新数据 因为业务的原因,一张表的数据需要整合两张外键关联不强的表数据,这里涉及到更新部分字段或者插入新数据。今天简单的做个笔记,后续有需要再补充完整 测试表结构: CREATE TABLE `test` ( `id` int(10) NOT NULL, `name` v.
1407 0
+关注
640
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载