`
frank1998819
  • 浏览: 734115 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类

MySQL 建表字段长度的限制 (转)

 
阅读更多

http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#column-type-overview

 

在MySQL建表时,遇到一个奇怪的现象:

root@localhost : test 10:30:54>CREATE TABLE tb_test (
    -> recordid varchar(32) NOT NULL,
    -> areaShow varchar(10000) DEFAULT NULL,
    -> areaShow1 varchar(10000) DEFAULT NULL,
    -> areaShow2 varchar(10000) DEFAULT NULL,
    -> PRIMARY KEY (recordid)
    -> ) ENGINE=INNODB DEFAULT CHARSET=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs
报错

root@localhost : test 10:31:01>CREATE TABLE tb_test (
    -> recordid varchar(32) NOT NULL,
    -> areaShow varchar(30000) DEFAULT NULL,
    -> areaShow1 varchar(30000) DEFAULT NULL,
    -> areaShow2 varchar(30000) DEFAULT NULL,
    -> PRIMARY KEY (recordid)
    -> ) ENGINE=INNODB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected, 3 warnings (0.26 sec)
可以建立只是类型被转换了。

root@localhost : test 10:31:14>show warnings;
+-------+------+----------------------------------------------------+
| Level | Code | Message                                            |
+-------+------+----------------------------------------------------+
| Note  | 1246 | Converting column 'areaShow' from VARCHAR to TEXT  |
| Note  | 1246 | Converting column 'areaShow1' from VARCHAR to TEXT |
| Note  | 1246 | Converting column 'areaShow2' from VARCHAR to TEXT |
+-------+------+----------------------------------------------------+
3 rows in set (0.00 sec)

疑问:

为什么字段小(10000)的反而报错,而大(30000)的则可以建立。为什么小的不能直接转换呢?

解决:

这里多感谢orczhou的帮助,原来MySQL在建表的时候有个限制:MySQL要求一个行的定义长度不能超过65535。具体的原因可以看:

http://dev.mysql.com/doc/refman/5.1/en/silent-column-changes.html

(1)单个字段如果大于65535,则转换为TEXT 。

(2)单行最大限制为65535,这里不包括TEXT、BLOB。

按照上面总结的限制,来解释出现的现象:

第一个情况是:
单个字段长度:varchar(10000) ,字节数:10000*3(utf8)+(1 or 2) = 30000 ,小于65535,可以建立。
单行记录长度:varchar(10000)*3,字节数:30000*3(utf8)+(1 or 2) = 90000,大于65535,不能建立,所以报错:

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

第二个情况是:
单个字段长度:varchar(30000) ,字节数:30000*3+(1 or 2) = 90000 , 大于65535,需要转换成TEXT,才可以建立。所以报warnings。
单行记录长度:varchar(30000)*3,因为每个字段都被转换成了TEXT,而TEXT没有限制,所以可以建立表。

root@localhost : test 10:31:14>show warnings;
+-------+------+----------------------------------------------------+
| Level | Code | Message                                            |
+-------+------+----------------------------------------------------+
| Note  | 1246 | Converting column 'areaShow' from VARCHAR to TEXT  |
| Note  | 1246 | Converting column 'areaShow1' from VARCHAR to TEXT |
| Note  | 1246 | Converting column 'areaShow2' from VARCHAR to TEXT |
+-------+------+----------------------------------------------------+

用了这么久的MySQL,这个基本的建表限制都还不知道,惭愧啊。。

分享到:
评论

相关推荐

    Mysql建表与索引使用规范详解

    四、 MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比。五、 MySQL使用时,一条SQL语句只能使用一个表的一个索引。所有的字段...

    MySQL 建表的优化策略 小结

    索引长度 4 5. 特殊字段 4 5.1. 冗余字段 4 5.2. 分割字段 4 5.3. BLOB和CLOB 5 6. 特殊 5 6.1. 表格分割 5 6.2. 使用非事务表类型 5 1. 字符集的选择 如果确认全部是中文,不会使用多语言以及中文无法表示的字符,...

    sql2entity:MySQL转换成Java实体类的小公举

    因为公司之前使用JPA,先写实体类再生产数据库建表语句,这样会有一个问题,数据建表语句都是没有注释的,对于新来的同事非常不友好,同时在开发中需要看字段意义的时候也并不方便,并且字段的类型和长度都需要显示的...

    数据库创库创表辅助工具

    /* // ...4、清除为清除字段名,字段类型,长度,默认值,和描述等数据,便于重建字段信息 5、SQL检测为检测创建的SQL-Query是不是正确 6、创建表,可以直接在数据库创建。 7、清屏,把SQL-Query清除

    MYSQL常用命令大全

    如果要对用户所用的登录终端进行限制,可以更新User表中相应用户的Host字段,在进行了以上更改后应重新启动数据库服务,此时登录时可用如下类似命令: mysql -uroot -p; mysql -uroot -pnewpassword; mysql mydb -u...

    MySQL调优及mysql性能优化.doc

    但是现实往往不如人意,每天可能产生的数据量是以数万或者数十万为单位的,这时就要充分地考虑在建表时的字段长度了。比如说在存储电话号的时候,如果将其写成CHAR(255),这显然会给数据库带来很多不必要的空间浪费,...

    Grails GORM 自动建表失败,且无错误提示信息

    造成建表失败的原因是 varchar 类型字段的 maxSize*3 超过了 mysql varchar 字段最大字节数。 为什么要乘以3呢?因为 mysql 类型长度是按字节算,而varchar长度是按字符算的,所以 varchar(1) 实际占用的字节长度是3...

    MySQL命令大全

    如果要对用户所用的登录终端进行限制,可以更新User表中相应用户的Host字段,在进行了以上更改后应重新启动数据库服务,此时登录时可用如下类似命令: mysql -uroot -p; mysql -uroot -pnewpassword; mysql mydb ...

    Mysql 建库建表技巧分享

    比如现在有2张表,一张新闻栏目表,一张新闻表,现在两张表需要进行关联,我想大多数人的做法肯定是在新闻表里建一个新闻栏目id,然后把新闻栏目表里的主键ID(自增)写到这个字段里,通过这样进行两表关联。...

    MySQL数据库命名规范及约定

    一、【操作规范】1. 如无备注,则表中的第一个id字段一定是主键且为自动增长;2. 如无备注,则数值类型的字段请使用UNSIGNED...8. 建表时将数据字典中的字段中文名和属性备注写入数据表的备注中(“PK、自动增长”不用写

    mysql数据库的基本操作语法

    --普通长度文本,default设置默认值 uName varchar(255) default ‘zhangsan’, --超长文本 uRemark text, --图片 uPhoto blob, --日期 uBirthday datetime ); 8、 子查询建表方法 部分列名匹配模式: create ...

    MySQL索引的创建与使用

    本文来自于csdn,本文主要通过示例介绍MySQL中的单列索引、组合索引的创建与使用,希望对您的学习有所帮助。索引有很多,且按不同的分类方式,又有很多种分类。不同的数据库,对索引的支持情况也不尽相同。索引的...

    MySQL 数据库铁律(小结)

    好的数据库规范有助于减少软件实现的复杂度,降低沟通成本,本铁律主要涵盖了建库建表、建索引、写 SQL、ORM 映射等方面的处理约定。 1.建库铁律 – 铁律 Level 备注 字符集 使用 utf-8。如果存储的是表情则...

    图书管理系统数据库结构及实体类.doc

    " "booksn "Varchar(16) "图书编号 "外键 " "bdate "Date "借阅时间 "非空 " "state "Varchar(4) "状态(在借/归还) "非空 " 类图 Create database 建数据库 Create table 建表 类和表的等价转换 Field name 字段名 ...

    2009达内SQL学习笔记

    当两个表有相同字段时必须加前缀,列名前需加表名和“.”,如“s_emp.id”。 1、用法:SELECT columns,prod2,prod3<列> FROM Table1,table2<表名> 分号结束 如: select id from s_emp; select last_name,name ...

Global site tag (gtag.js) - Google Analytics