分类: Mysql/postgreSQL
关于mysql块内存储长度的研究。欢迎指正。。
mysql存储,一行最多存储65532字节,即所有字段加起来,长度不能超过这个值。65532字节换算下就是63.99KB(64KB=65536字节)。
BLOB and TEXT列在一行中只会占8个字节,因为它们是另外单独存储的。关于null值和非null值存储引擎不同,储的方式不同,具体参照官网。
参考:http://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html
gbk:每个字符占2个字节.(最大长度是:65532/2=32766)
--验证text在行中只会占8个字节
-------------------------我是分隔线--------------------------------------
--验证一个列最长只能存储65535个字节
即65535/2=16383,另外还需要一部分空间来存储字段长度。测试如下:
-------------------------我是分隔线--------------------------------------
再来看一下varchar和char的存储。
VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。
65532/2=32766
char最长支持为255
---------------------我是分隔线---------------------------------------------------------------
BLOB 列被视为二进制字符串(字节字符串)。TEXT列被视为非二进制字符串(字符字符串)。BLOB列没有字符集,并且排序和比较基于列值字节的数值值。
--关于text和varchar的区别
找了下资料,发现5.0.3版本之前,mysql varchar最大支持长度是255,那时候需要大于255的字段,只能使用text来代替。
5.0.3版本之后,varchar和text的支持长度都是65535,那么使用哪种类型比较好呢?
我们都知道,varchar和数据行本身都是存储在同一个数据块内的,如果能在一个行中放下,使用varchar当然可以做到I/O最少。但是如果不能放少,那么只能用text。
此外,TEXT列有一个字符集,并且根据字符集的 校对规则对值进行排序和比较。
varchar:如果插入内容后面有多余的空格,不会储存,节省空间。
一般描述性文字比较多的时候,尽量使用text。使用text,在进行模糊查询的时候,并不会影响速度的。
仅仅最前面的max_sort_length 字节是排序的, max_sort_length 默认值是1024,可以在session级别改变这个值的设置。
mysql> SET max_sort_length = 2000;
mysql> SELECT id, comment FROM t
-> ORDER BY comment;
另外还有许多因素的不同:text的限制比较多(类似oracle的clob),比如text不能有默认值,索引时必需要指定一个前缀长度。
参考:http://dev.mysql.com/doc/refman/5.1/en/blob.html
其实在mysql中,各个字段都是一种映射关系,mysql对此都是兼容的。因为在很多类型之前存在映射的关系,mysql类型的限制很宽松,所以建了表之后,最好查看下字段的类型。
如:
创建text类型的表
mysql存储,一行最多存储65532字节,即所有字段加起来,长度不能超过这个值。65532字节换算下就是63.99KB(64KB=65536字节)。
BLOB and TEXT列在一行中只会占8个字节,因为它们是另外单独存储的。关于null值和非null值存储引擎不同,储的方式不同,具体参照官网。
参考:http://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html
gbk:每个字符占2个字节.(最大长度是:65532/2=32766)
--验证text在行中只会占8个字节
mysql> create table t4(id varchar(32761),name text) ENGINE=InnoDB DEFAULT CHARSET=gbk;
Query OK, 0 rows affected (0.04 sec)
mysql> drop table t4;
Query OK, 0 rows affected (0.01 sec)
mysql> create table t4(id varchar(32762),name text) ENGINE=InnoDB DEFAULT CHARSET=gbk;
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
-------------------------我是分隔线--------------------------------------
--验证一个列最长只能存储65535个字节
即65535/2=16383,另外还需要一部分空间来存储字段长度。测试如下:
mysql> create table t4(id1 varchar(16382),id2 varchar(16383)) ENGINE=InnoDB DEFAULT CHARSET=gbk;
Query OK, 0 rows affected (0.02 sec)
mysql> drop table t4;
Query OK, 0 rows affected (0.02 sec)
mysql> create table t4(id1 varchar(16383),id2 varchar(16383)) ENGINE=InnoDB DEFAULT CHARSET=gbk;
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和char的存储。
VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。
65532/2=32766
mysql> create table t4(id varchar(32766)) ENGINE=InnoDB DEFAULT CHARSET=gbk;
Query OK, 0 rows affected (0.05 sec)
mysql> desc t4;
+-------+----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| id | varchar(32766) | YES | | NULL | |
+-------+----------------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> drop table t4;
Query OK, 0 rows affected (0.02 sec)
mysql> create table t4(id varchar(32767)) ENGINE=InnoDB DEFAULT CHARSET=gbk;
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
char最长支持为255
mysql> create table t4(id char(255)) ENGINE=InnoDB DEFAULT CHARSET=gbk;
Query OK, 0 rows affected (0.05 sec)
mysql> desc t4;
+-------+-----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------+-------+
| id | char(255) | YES | | NULL | |
+-------+-----------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> create table t5(id char(256)) ENGINE=InnoDB DEFAULT CHARSET=gbk;
ERROR 1074 (42000): Column length too big for column 'id' (max = 255); use BLOB or TEXT instead
---------------------我是分隔线---------------------------------------------------------------
BLOB 列被视为二进制字符串(字节字符串)。TEXT列被视为非二进制字符串(字符字符串)。BLOB列没有字符集,并且排序和比较基于列值字节的数值值。
--关于text和varchar的区别
找了下资料,发现5.0.3版本之前,mysql varchar最大支持长度是255,那时候需要大于255的字段,只能使用text来代替。
5.0.3版本之后,varchar和text的支持长度都是65535,那么使用哪种类型比较好呢?
我们都知道,varchar和数据行本身都是存储在同一个数据块内的,如果能在一个行中放下,使用varchar当然可以做到I/O最少。但是如果不能放少,那么只能用text。
此外,TEXT列有一个字符集,并且根据字符集的 校对规则对值进行排序和比较。
varchar:如果插入内容后面有多余的空格,不会储存,节省空间。
一般描述性文字比较多的时候,尽量使用text。使用text,在进行模糊查询的时候,并不会影响速度的。
仅仅最前面的max_sort_length 字节是排序的, max_sort_length 默认值是1024,可以在session级别改变这个值的设置。
mysql> SET max_sort_length = 2000;
mysql> SELECT id, comment FROM t
-> ORDER BY comment;
另外还有许多因素的不同:text的限制比较多(类似oracle的clob),比如text不能有默认值,索引时必需要指定一个前缀长度。
参考:http://dev.mysql.com/doc/refman/5.1/en/blob.html
其实在mysql中,各个字段都是一种映射关系,mysql对此都是兼容的。因为在很多类型之前存在映射的关系,mysql类型的限制很宽松,所以建了表之后,最好查看下字段的类型。
如:
mysql> create table t3(id varchar(65500));
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> desc t3;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | mediumtext | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> create table t4(id varchar(30000)) ENGINE=InnoDB DEFAULT CHARSET=gbk;
Query OK, 0 rows affected (0.05 sec)
mysql> desc t4;
+-------+----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| id | varchar(30000) | YES | | NULL | |
+-------+----------------+------+-----+---------+-------+
1 row in set (0.00 sec)
创建text类型的表
mysql> create table tt(name text) ENGINE=InnoDB DEFAULT CHARSET=gbk;
Query OK, 0 rows affected (0.04 sec)
mysql> desc tt;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| name | text | YES | | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> create table tt(name text(65532)) ENGINE=InnoDB DEFAULT CHARSET=gbk;
Query OK, 0 rows affected (0.05 sec)
mysql> desc tt;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| name | mediumtext | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
1 row in set (0.01 sec)
mysql> drop table tt;
Query OK, 0 rows affected (0.02 sec)
mysql> create table tt(name text(30000)) ENGINE=InnoDB DEFAULT CHARSET=gbk;
Query OK, 0 rows affected (0.05 sec)
mysql> desc tt;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| name | text | YES | | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)
相关推荐
在MySQL中,`VARCHAR`是一种用于存储可变长度字符串的数据类型,它的长度设置是非常关键的,因为它直接影响到存储空间的使用效率和数据的正确性。`VARCHAR`的长度设置方法是通过在类型名后面括号内指定最大字符数,...
### MySQL所有字段类型及长度范围详解 在数据库设计与应用开发过程中,选择合适的字段类型对于确保数据的准确存储和高效处理至关重要。MySQL提供了丰富的数据类型,涵盖了数字、字符串、日期时间等多种类别,满足了...
在MySQL中,`VARCHAR`类型用于存储可变长度的字符串,它相较于`CHAR`类型更加节省空间,因为它只存储实际输入的数据长度。然而,在数据库设计过程中,有时可能会遇到需要动态修改`VARCHAR`字段长度的情况,这通常是...
MySQL 存储引擎详解 MySQL 存储引擎是 MySQL 数据库管理系统中的一种机制,用于管理和存储数据。 MySQL 提供了多种存储引擎,每种引擎都有其特点和优缺。了解 MySQL 存储引擎的特点和优缺是非常重要的,因为它们...
### MySQL存储和显示图片知识点详解 #### 一、MySQL存储图片的基本原理 在MySQL数据库中存储图片主要通过二进制格式来实现。由于图片本质上是由一系列的二进制数据构成的,因此将其作为二进制大对象(Binary Large ...
MySQL中的VARCHAR类型是一种可变长度的字符串数据类型,它在存储空间上相比固定长度的CHAR类型更为节省。本文将深入探讨VARCHAR类型的大小长度问题及其在不同版本和编码下的限制。 首先,VARCHAR字段的长度限制主要...
根据提供的文件内容,本篇实验报告主要围绕MySQL数据库中存储过程和函数的应用,涵盖了创建存储过程、函数、游标以及异常处理等高级特性。下面将详细解析报告中的每个知识点。 1. 创建存储过程 存储过程是一种在...
在本项目中,我们主要探讨的是如何在MySQL数据库中实现AES加密存储算法,并通过MATLAB进行访问和操作。AES(Advanced Encryption Standard),即高级加密标准,是一种广泛应用的对称加密算法,广泛用于保护敏感数据...
- **定义**: 定义MySQL服务器在短时间内接收到大量连接请求时能处理的最大数量。该值决定了等待被接受的连接数,这些连接将在主MySQL线程能够处理它们之前排队等待。 - **作用范围**: 全局级别。 - **配置**: 可以在...
在ASP(Active Server Pages)开发过程中,数据库的交互是一个至关重要的环节,特别是使用MySQL作为后端数据存储时。本文档“ASP技术常遇问题解答-MYSQL各字段的长度是多少?”显然是针对开发者在处理MySQL数据库...
在“MySQL.rar_MYSQL_linux mysql_mysql二进制_mysql存储文件”这个压缩包中,我们主要关注的是如何在MySQL中存储二进制文件以及在Linux环境下操作MySQL的相关知识。 首先,MySQL支持多种数据类型,其中BLOB...
但在您的描述中,字段长度设置为0,这可能导致MySQL自动地将其四舍五入到最近的毫秒。例如,入库前的时间是2020/06/11 07:41:02.900000000,但入库后时间被四舍五入到了2020/06/11 07:41:03.000000000。 要解决这个...
- VARBINARY:用于存储可变长度的二进制数据,长度不固定。 7. 无类型: - NULL:一个特殊的值,表示“无”或“未知”。 8. ENUM和SET类型: - ENUM:用于创建列,该列只能包含预定义的离散值列表中的一个。 -...
根据提供的文件信息,我们可以深入探讨 MySQL 存储过程的相关知识点,包括存储过程的创建、调用、删除,以及其中常用的一些流程控制语句和函数。 ### 一、MySQL 存储过程简介 #### 1. 创建存储过程 存储过程是一种...
在MySQL数据库中,处理字符串是常见的操作之一,而获取字符串的长度则是这些操作中的基本功能。本文将深入探讨两个用于获取字符串长度的函数——`LENGTH()`和`CHAR_LENGTH()`,以及它们之间的区别。 首先,`LENGTH...
### MySQL存储引擎比较 #### 一、概述 MySQL是一款广泛使用的开源关系型数据库管理系统,在不同的应用场景下,选择合适的存储引擎至关重要。MySQL支持多种存储引擎,每种存储引擎都有其独特的特性和适用场景。本文...
在Java编程中,有时我们需要将图片等大容量的二进制数据存储到数据库中,MySQL提供了BLOB(Binary Large Object)类型,专门用于存储大块的二进制数据。本实例将详细介绍如何使用Java和MySQL进行图片的存取操作。 ...
对于varchar字段,可能需要在转换前对源数据进行分析,确定实际的最大长度,然后在MySQL中设置合适的varchar长度,以平衡存储效率和数据完整性。 文件“mpp数据库长度转换.xls”很可能包含了一个表格,列出了源...
9. **类型转换**:在处理查询结果时,可能需要将MySQL数据类型转换为C语言的数据类型,如`mysql_fetch_lengths()`获取每列的长度,有助于正确地处理BLOB和VARBINARY等变长类型。 10. **性能优化**:使用`mysql_...