MySQL中varchar类型在5.0.3后的变化

1.mysql varchar类型变化:
mysql 5.0.3 之前:

0--255字节

varchar(20)中的20表示字节数,如果存放urf8编码的话只能放6个汉字。

MySQL 5.0.3 之后:

0--65535字节

varchar(20)表示字符数,不管什么编码,既汉字也能放20个。但最多占65532字节(两个字节存放长度,小于255字节用1个字节存放长度)

1.存储限制:

varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65532。

2.字符编码的长度限制:

字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。

若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

3.行长度限制:

导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过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。

**************************
通过navicat测试得出,

当字段为utf8编码时,最大长度设置21845,但会出现警告ERROR 1118 (42000): Row size too large...,改为略小于21845的数值可以。

修改为gbk,最大长度设置32766,但会出现警告ERROR 1118 (42000): Row size too large...,改为略小于32766的数值可以。

***************************

2.CHAR(M), VARCHAR(M)不同之处

CHAR(M):

列的长度为固定的,M取值可以为0~255之间

当保存CHAR值时,在它们的右边填充空格以达到指定的长度。

当检 索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。

CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义 char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

VARCHAR(M):

列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用 的字符集确定。整体最大长度是65,532字节)。

VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则 使用两个字节)。

VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。

varchar存储变长数据,但存储效率没有 CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么"+1"呢?这一个字节用于保存实际使用了多大的长度。 从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

CHAR和VARCHAR最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此实际存储的时候是实际字符串再加上一个记录 字符串长度的字节(如果超过255则需要两个字节)。如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉 的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。

3. VARCHAR和TEXT、BlOB类型的区别

VARCHAR,BLOB和TEXT类型是变长类型,对于其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型 的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度 ,加上1个字节以记录字符串的长度。对于字符串‘abcd‘,L是4而存储要求是5个字节。

BLOB和TEXT类型需要1,2,3或4个字节来记录列值的长度,这取决于类型的最大可能长度。VARCHAR需要定义大小,有65535字节的最大限制;TEXT则不需要(不用指定长度)。如果你把一个超过列类型最大长度的值赋给一个BLOB或TEXT列,值被截断以适合它。

一个BLOB是一个能保存可变数量的数据的二进制的大对象。4个BLOB类型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB仅仅在他们能保存值的最大长度方面有所不同。

BLOB 可以储存图片,TEXT不行,TEXT只能储存纯文本文件。4个TEXT类型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应于 4个BLOB类型,并且有同样的最大长度和存储需求。在BLOB和TEXT类型之间的唯一差别是对BLOB值的排序和比较以大小写敏感方式执行,而对 TEXT值是大小写不敏感的。换句话说,一个TEXT是一个大小写不敏感的BLOB。

4.总结char,varchar,text区别

长度的区别,char范围是0~255,varchar最长是64k,但是注意这里的64k是整个row的长度,要考虑到其它的 column,还有如果存在not null的时候也会占用一位,对不同的字符集,有效长度还不一样,比如utf8的,最多21845,还要除去别的column,但是varchar在一般 情况下存储都够用了。如果遇到了大文本,考虑使用text,最大能到4G。

效率来说基本是char>varchar>text,但是如果使用的是Innodb引擎的话,推荐使用varchar代替char

char和varchar可以有默认值,text不能指定默认值

数据库选择合适的数据类型存储还是很有必要的,对性能有一定影响。这里在零碎记录两笔,对于int类型的,如果不需要存取负值,最好加上unsigned;对于经常出现在where语句中的字段,考虑加索引,整形的尤其适合加索引。

时间: 2024-10-15 22:11:29

MySQL中varchar类型在5.0.3后的变化的相关文章

Java学习篇之---Mysql中varchar类型总结

Mysql中varchar类型总结 今天新做一个项目,需要自己进行数据库设计,发现自己对varchar的用法还不是很熟悉,所以查阅资料总结若下: 1.varchar类型的变化 MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定).在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字 节,也就是说,在4.1或以

MySQL中varchar与char区别

MySQL中varchar与char区别(转) MySQL中varchar最大长度是多少? 一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字.字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节 Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同. 二. varchar和

int(11)最大长度是多少,MySQL中varchar最大长度是多少(转)

int(11)最大长度是多少,MySQL中varchar最大长度是多少? int(11)最大长度是多少? 在SQL语句中int代表你要创建字段的类型,int代表整型,11代表字段的长度. 这个11代表显示宽度,整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,比如,不管设定了显示宽度是多少个字符,bigint都要占用8个字节. int是整型,(11)是指显示字符的长度,但要加参数的,最大为255,比如它是记录行数的id,插入10笔资料,它就显示0

MYSQL中TIMESTAMP类型的默认值

MYSQL中TIMESTAMP类型可以设定默认值,就像其他类型一样. 表: —————————————————————————————————————— t1      CREATE TABLE `t1` (                                                                             `p_c` int(11) NOT NULL,                                              

转:Mysql 中 varchar字段的存储限制

被问到一个问题:MySQL中varchar最大长度是多少?这不是一个固定的数字.本文简要说明一下限制规则. 1.限制规则 字段的限制在字段定义的时候有以下规则: a) 存储限制 varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535. b) 编码长度限制 字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766; 字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过2184

MYSQL中TIMESTAMP类型的默认值理解

MYSQL中TIMESTAMP类型可以设定默认值,就像其他类型一样. 1.自动UPDATE 和INSERT 到当前的时间:表:——————————— Table   Create Table                                                                         —— ————————————————————————————-t1      CREATE TABLE `t1` (                       

Mysql中varchar和char区别

一.varchar和char的区别: 区别一:定长和变长 char表示定长.长度固定,varchanr表示变长,即长度可变. 即char类型是规定多少字长则必须存储多少字长,超过的长度的字段则只能截取出对应的长度进行存储,相对于要求字长长度不够的字段则用空格补齐. 而varchar类型则是只要在规定字长之内,有多少存多少,无需补齐:超出的部分和char一样,舍去即可.(由perfix来实现) 区别二:存储容量不同 对于char类型来说,最多只能存放的字符个数为255,和编码无关. varchar

mysql 中Varchar 与char的区别

一.字符与字节与编码关系 ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间.一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制.最小值0,最大值255. UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节. Unicode编码中,一个英文等于两个字节,一个中文(含繁体)等于两个字节. 二.Varchar与char区别 char固定长度的类型:char(M)类型的数据列里,每个值都占用M个字节,如果某个长

关于MySQL中存储类型为Float,使用jdbc查询时丢失精度,或者自动四舍五入的问题

一.   mysql表结构: member_price列的数据类型是float(20,2)(注: 表示最多20位浮点数,精度为2位) 插入记录: INSERT INTO `member_price` (`id`, `data_type`, `month`, `member_count`, `member_price`, `create_at`) VALUES ('1', '1', '2015-11', '5864', '1765910.8745120', '1450078966586'); IN