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,这个基本的建表限制都还不知道,惭愧啊。。
相关推荐
- 在建表语句中合理设置字段长度,避免浪费存储空间。 - 使用合适的数据类型,考虑数据范围和精度。 - 添加适当的索引以优化查询性能,但不要过度索引。 - 考虑使用InnoDB存储引擎以利用事务支持和行级锁定。 ...
标题中的“Excel生成MYSQL建表语句”是指利用JAVA编程技术,通过读取预先设计好的Excel模板,自动生成对应的MySQL数据库建表语句的过程。这个过程通常涉及到数据处理、文件读写以及数据库操作等核心技能。 首先,让...
本资源“MySQL建表样本数据代码.rar”显然是一个帮助用户快速构建MySQL数据库并填充初始样本数据的工具包。下面,我们将详细讨论MySQL建表和插入数据的相关知识点。 首先,我们来看“建表代码.txt”。在MySQL中,...
2. **解析表结构**:查询MySQL的元数据信息,如字段名、字段类型、字段长度、是否为主键等。 3. **映射数据类型**:将MySQL的数据类型映射到Hive支持的数据类型。例如,MySQL的INT映射为Hive的INT,VARCHAR映射为...
- `VARCHAR`在MySQL中没有明确的最大长度限制,但在PostgreSQL中需要指定最大长度。 - `DATE`, `TIME`, `DATETIME`在MySQL中可以直接使用,而在PostgreSQL中可能需要转换为`DATE`, `TIME`, `TIMESTAMP`。 - MySQL...
### MySQL与DB2建表SQL语句的主要差异 在数据库管理领域中,不同的数据库系统有着各自独特的特性与语法。MySQL和DB2作为两种广泛使用的数据库管理系统,在创建表时存在一些重要的差异。理解这些差异对于跨数据库...
以下是对“MySQL建表的规范总结.pdf”中提到的关键点的详细解释: **设计表规范** 1. **字段非空和默认值**:创建表时,为确保数据完整性,字段应尽可能设置为非空(NOT NULL),并设定默认值。这样可以避免插入...
以下是对MySQL建表和索引使用规范的详细说明: **一、设计表规范** 1. **非空约束与默认值**:在创建表时,为确保数据完整性,字段应尽可能设置为非空(NOT NULL)。若允许字段为空,应提供默认值,以防止插入空值...
MySQL数据库在设计和优化中,建表和索引的使用规范是至关重要的,它们直接影响到数据存储的效率和查询性能。以下是对这些规范的详细解释: 1. **字段设置**: - **非空约束**:在创建表时,推荐为字段设置非空约束...
主键字段长度需根据实际需求设定,例如tinyint、smallint、mediumint、int和bigint分别适用于不同大小的整数范围。 3. **外键**:外键用于保持数据的一致性,但会影响插入和更新速度。在大量数据导入时,可临时禁用...
在MySQL数据库管理中,创建表是一项基础而关键的操作,它涉及到如何定义数据结构,以便有效地存储和检索数据。本文将详细解析几个典型的`CREATE TABLE`语句,这些语句不仅展示了如何构建表的基本框架,还深入探讨了...
这份脚本主要涉及到了数据库的创建、表的设计以及字段属性的定义等内容。下面将详细解析该脚本中的关键知识点。 ### 一、数据库基本信息 文档中提到了数据库管理系统(DBMS)的名称为MySQL 5.0,并指出了此脚本...
本篇文章将深入探讨如何利用Delphi开发一个建表处理工具,实现数据库表的创建以及字段说明等信息的管理。 首先,理解建表功能的关键在于数据库设计。在Delphi中,我们通常会使用ADO(ActiveX Data Objects)或...
### MySQL建表规则与注意事项详解 #### 一、命名规则 **1.1 库名与应用名称一致性** - **推荐做法**:建议数据库的名字与应用程序的名称保持一致,这样可以便于开发人员理解和记忆,同时也方便后期维护。 **1.2 ...
在本教程中,我们将重点讨论如何使用PowerDesigner配置MySQL5.0的建表脚本格式。 首先,我们需要在PowerDesigner中设置自定义的数据库管理系统(DBMS)。这可以通过`Tools`菜单 -> `Resources` -> `DBMS`路径完成。在...
- 在`varchar`字段上创建索引时,必须指定索引长度,无需对全字段建立索引,可以根据实际文本区分度决定索引长度。 2. **索引与JOIN操作**: - 超过三个表禁止进行JOIN操作。 - 需要JOIN的字段,数据类型必须...