`
frank1998819
  • 浏览: 764896 次
  • 性别: 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,这个基本的建表限制都还不知道,惭愧啊。。

分享到:
评论

相关推荐

    java实体转mysql建表语句

    - 在建表语句中合理设置字段长度,避免浪费存储空间。 - 使用合适的数据类型,考虑数据范围和精度。 - 添加适当的索引以优化查询性能,但不要过度索引。 - 考虑使用InnoDB存储引擎以利用事务支持和行级锁定。 ...

    Excel生成MYSQL建表语句

    标题中的“Excel生成MYSQL建表语句”是指利用JAVA编程技术,通过读取预先设计好的Excel模板,自动生成对应的MySQL数据库建表语句的过程。这个过程通常涉及到数据处理、文件读写以及数据库操作等核心技能。 首先,让...

    MySQL建表样本数据代码.rar

    本资源“MySQL建表样本数据代码.rar”显然是一个帮助用户快速构建MySQL数据库并填充初始样本数据的工具包。下面,我们将详细讨论MySQL建表和插入数据的相关知识点。 首先,我们来看“建表代码.txt”。在MySQL中,...

    mysql数据抽取,自动生成hive建表语句

    2. **解析表结构**:查询MySQL的元数据信息,如字段名、字段类型、字段长度、是否为主键等。 3. **映射数据类型**:将MySQL的数据类型映射到Hive支持的数据类型。例如,MySQL的INT映射为Hive的INT,VARCHAR映射为...

    Mysql建表语句转化为postgre语句

    - `VARCHAR`在MySQL中没有明确的最大长度限制,但在PostgreSQL中需要指定最大长度。 - `DATE`, `TIME`, `DATETIME`在MySQL中可以直接使用,而在PostgreSQL中可能需要转换为`DATE`, `TIME`, `TIMESTAMP`。 - MySQL...

    MySQL和DB2建表SQL差异

    ### MySQL与DB2建表SQL语句的主要差异 在数据库管理领域中,不同的数据库系统有着各自独特的特性与语法。MySQL和DB2作为两种广泛使用的数据库管理系统,在创建表时存在一些重要的差异。理解这些差异对于跨数据库...

    MySQL建表的规范总结.pdf

    以下是对“MySQL建表的规范总结.pdf”中提到的关键点的详细解释: **设计表规范** 1. **字段非空和默认值**:创建表时,为确保数据完整性,字段应尽可能设置为非空(NOT NULL),并设定默认值。这样可以避免插入...

    MySQL建表的规范总结[归类].pdf

    以下是对MySQL建表和索引使用规范的详细说明: **一、设计表规范** 1. **非空约束与默认值**:在创建表时,为确保数据完整性,字段应尽可能设置为非空(NOT NULL)。若允许字段为空,应提供默认值,以防止插入空值...

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

    MySQL数据库在设计和优化中,建表和索引的使用规范是至关重要的,它们直接影响到数据存储的效率和查询性能。以下是对这些规范的详细解释: 1. **字段设置**: - **非空约束**:在创建表时,推荐为字段设置非空约束...

    MySQL 建表的优化策略 小结

    主键字段长度需根据实际需求设定,例如tinyint、smallint、mediumint、int和bigint分别适用于不同大小的整数范围。 3. **外键**:外键用于保持数据的一致性,但会影响插入和更新速度。在大量数据导入时,可临时禁用...

    mysql建表语句

    在MySQL数据库管理中,创建表是一项基础而关键的操作,它涉及到如何定义数据结构,以便有效地存储和检索数据。本文将详细解析几个典型的`CREATE TABLE`语句,这些语句不仅展示了如何构建表的基本框架,还深入探讨了...

    项目建表语句

    这份脚本主要涉及到了数据库的创建、表的设计以及字段属性的定义等内容。下面将详细解析该脚本中的关键知识点。 ### 一、数据库基本信息 文档中提到了数据库管理系统(DBMS)的名称为MySQL 5.0,并指出了此脚本...

    delphi 建表处理工具,实现建表功能,字段说明等信息的创建。

    本篇文章将深入探讨如何利用Delphi开发一个建表处理工具,实现数据库表的创建以及字段说明等信息的管理。 首先,理解建表功能的关键在于数据库设计。在Delphi中,我们通常会使用ADO(ActiveX Data Objects)或...

    mysql .pdf建表的一些规则 和注意事项

    ### MySQL建表规则与注意事项详解 #### 一、命名规则 **1.1 库名与应用名称一致性** - **推荐做法**:建议数据库的名字与应用程序的名称保持一致,这样可以便于开发人员理解和记忆,同时也方便后期维护。 **1.2 ...

    PowerDesign配置MySQL5.0建表脚本格式.docx

    在本教程中,我们将重点讨论如何使用PowerDesigner配置MySQL5.0的建表脚本格式。 首先,我们需要在PowerDesigner中设置自定义的数据库管理系统(DBMS)。这可以通过`Tools`菜单 -> `Resources` -> `DBMS`路径完成。在...

    阿里巴巴MySQL开发规范

    - 在`varchar`字段上创建索引时,必须指定索引长度,无需对全字段建立索引,可以根据实际文本区分度决定索引长度。 2. **索引与JOIN操作**: - 超过三个表禁止进行JOIN操作。 - 需要JOIN的字段,数据类型必须...

Global site tag (gtag.js) - Google Analytics