上述表格中的数值类型都是定长的,也就是说,无论你存的数值是多少,多大或者多小,占用的存储字节大小都是固定的。例如,设置int(1),虽然M值是1个字符,但是它所占用的空间大小永远都是4个字节的大小,换句话说就是,你可以存入有符号整型从-2 147 483 648到2 147 483 647包括这两个数的中间任何一个数。int(1)和int(11)占用的是4个字节,可以存入上述这些数,tinyint(1)和tinyint(4)占用的是1个字节,可以存入从-128到127的数。

设置tinyint(m),int(m)这个指示最大显示宽度,最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关。

该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。

显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。

但是这个值只有在设置zerofill(表示用0填充)属性时才有作用。例如我们设置tinyint(2),勾选zerofill属性,当插入1时,我们查出来的数据会显示为 01;就是当值的字符数不足m个时,左边位置会通过补0来凑足m位。

如果为一个数值列指定ZEROFILL,MySQL自动为该列添加UNSIGNED属性。

需要强调的是,不同的数据类型中的M值意义是不一样的

结论:

1、数值类型已经限制了取值范围,有符号整型和无符号整型都有,而M值并不代表可以存储的数值字符长度,它代表的是数据在显示时显示的最小宽度;

2、当存储的字符长度超过M值时,没有任何的影响,只要不超过数值类型限制的范围;

3、当存储的字符长度小于M值时,只有在设置了zerofill用0来填充,才能够看到效果,换句话就是说,没有zerofill,M值就是无用的。

而char(m).varchar(m)里面的m跟数值类型的意义又不一样

CHAR(M)

  固定长度字符串,当保存时在右侧填充空格以达到指定的长度。M表示列长度。M的范围是0到255个字符。当检索CHAR值时尾部空格被删除。

如果想要将某个CHAR的长度设为大于255,执行的CREATE TABLE或ALTER TABLE语句将失败并提示错误:

mysql> CREATE TABLE c1 (col1 INT, col2 CHAR(500));

ERROR 1074 (42000): Column length too big for column 'col' (max = 255); use BLOB or TEXT instead

VARCHAR(M)
  变长字符串。M 表示最大列长度。M的范围是0到65,535。(VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定。最大有效长度是65,532字节)。

VARCHAR保存时用一个字节或两个字节长的前缀+数据。如果VARCHAR列声明的长度大于255,长度前缀是两个字节。

char(4) 存储需求 varchar(4) 存储需求
'' '    ' 4个字节 '' 1个字节
'ab' 'ab  ' 4个字节 'ab' 3个字节
'abcd' 'abcd' 4个字节 'abcd' 5个字节
'abcdefgh' 'abcd' 4个字节 'abcd' 5个字节

char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是: char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)。

在表结构定义中声明char和varchar类型时,必须指定字符串的长度.也就是该列所能存储多少个字符(不是字节,是字符).例如:char(10)和varchar(10)都能存储10个字符.

存储固定长度的字符,根据编码方式不一样占据的字节也不一样,通过LENGTH()可以返回字符串所占用的字节数,通过CHAR_LENGTH()返回字符串中的字符数。

①ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。

②UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。

③Unicode编码中,一个英文等于两个字节,一个中文(含繁体)等于两个字节。

文本符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。

④UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。

⑤UTF-32编码中,世界上任何字符的存储都需要4个字节。

参考资料 :http://www.mysqlab.net/docs/view/refman-5.1-zh/chapter/column-types.html

 

mysql 数值与字符类型 长度梳理的更多相关文章

  1. MySQL学习----各种字符的长度总结

    数字型 类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767) (0, ...

  2. mysql数据库设计字符类型及长度

    1.数字类型 小数的我就不聊了,因为有小数点的一般都是用字符串保存.关于整数,有几种可以选TINYINT.SMALLINT.MEDIUMINT.INT和BIGINT,分别占1.2.4.8字节.如果无符 ...

  3. MySQL 基础--字符类型

    ##=====================================================================================## MySQL支持的字符 ...

  4. MySQL数据库修改字段的长度

    数据库版本:5.7.22 使用DDL语句:alter table 表名 modify 字段名 字符类型(长度) 例如: alter table db2.admin modify password );

  5. MySql 插入10位以上长度的字符报错or截断

    当a字段为int类型时: 如果用MyBatis向MySql插入10个字符以上长度的字符串,则会报错. 如果直接在MySql中用sql语句插入10个字符以上长度的字符串,则会变成最大的int类型数值:2 ...

  6. Mysql 相关字段类型长度

    1.  Compact行记录是在MySQL 5.0时被引入的,其设计目标是能高效存放数据. 2.  Redundant是MySQL 5.0版本之前InnoDB的行记录存储方式. 3.  InnoDB存 ...

  7. MySQL字符类型datetime与timestamp

    这片博客来详细分区一下这哥俩! 首先来说明这两个字符类型: DATETIME 8 1000-01-01 00:00:00 ~9999~12-31 23:59:59 0000-00-00 00:00:0 ...

  8. Mysql 数据库字符类型详解

    MySQL 中提供了多种对字符数据的存储类型,不同的版本可能有所差异.以5.0 版本为例,MySQL 包括了CHAR.VARCHAR.BINARY.VARBINARY.BLOB.TEXT.ENUM 和 ...

  9. mysql string types ---- mysql 字符类型详解

    一.mysql 中包涵的字符类型: [national] char [(m)] [character set charset_name] [collate collation_name] [natio ...

随机推荐

  1. 2013-7-28 802.11n帧聚合

    芯片开发阶段的帧聚合迥异于商用AP,前者更偏向实现过程,后者偏向结果.也就是说用户在使用商用设备时不会管你特性是如何实现的,他们只关心效果,开启这个功能能否实实在在的提高AP的吞吐量. 网上搜索了众多 ...

  2. springMVC参数绑定JSON类型的数据

    需求就是: 现在保存一个Student,并且保存Student的friend,一个student会有多个朋友,这里要传递到后台的参数是: var friends = new Array(); var ...

  3. python接口自动化20-requests获取响应时间(elapsed)与超时(timeout)

    前言 requests发请求时,接口的响应时间,也是我们需要关注的一个点,如果响应时间太长,也是不合理的. 如果服务端没及时响应,也不能一直等着,可以设置一个timeout超时的时间 关于reques ...

  4. selenium APi

    1.查看浏览器的名字方法:name实例:drvier.name 2.删除浏览器所以的cookies方法:delete_all_cookies()实例:driver.delete_all_cookies ...

  5. ORA-03113:通信通道的文件结尾

    问题: 用命令startup启动实例时,报错“ORA-03113:通信通道的文件结尾”. 解决: SQL> startup mount ORACLE 例程已经启动. Total System G ...

  6. python对象转字典

    1.基础实现 class TestDict: name = "wyb" age = " def __init__(self): self.gender = 'male' ...

  7. django-区分时区的时间类型

    # aware time:清醒的时间(清醒的知道自己这个时间代表的是哪个时区的)# navie time:幼稚的时间(不知道自己的时间代表的是哪个时区) 在settings.py中设置 LANGUAG ...

  8. C# WebBrowser

    WebBrowser中的按钮调用WinForm中的事件: private void Form1_Load(object sender, EventArgs e) { this.webBrowser1. ...

  9. WindowBrush

    m_Element.Fill = SystemColors.WindowBrush; BorderBrush="{x:Static SystemColors.WindowBrush}&quo ...

  10. PHP依赖注入

    对于依赖注入 我现在的理解是把一个方法当成一个变量放进另一个方法的形参里 <?php class Factory { public static function getDb(){ return ...