码迷,mamicode.com
首页 > 数据库 > 详细

Mysql数据类型

时间:2016-07-14 15:43:51      阅读:373      评论:0      收藏:0      [点我收藏+]

标签:

所谓的数据类型:对数据进行统一的分类。从系统的角度出发,是为了使用统一的方式进行管理,更好的利用有限的空间。

SQL中将数据类型分了三大类:数值类型、字符串类型和时间日期类型
技术分享

数值型

数值型数据:都是数值
系统将数值型分为整数型和小数型

整数型

存放整形数据:在SQL中 因为更多要考虑如何节省磁盘控件,所以系统将整型又细分了5类
1. Tinyint:迷你整型,使用一个字节存储,表示的状态最多为256种。(常用)
2. Smallint:小整型,使用2个字节存储,表示的状态最多为65536中。
3. Mediumint:中整型,使用3个字节存储
4. Int:标准整型,使用4个字节存储(常用)
5. Bigint:大整型,使用8个字节存储
技术分享

创建一张整型表
技术分享

插入数据:智能插入整型,只能插入范围内的数据
技术分享

SQL中数值类型全部都是默认有符号:分正负
有时候需要使用无符号数据:需要给数据类型限定:int unsigned
技术分享

数值的插入
技术分享

查看表结构的时候,发现每个字段的数据类型之后都会自带一个括号,里面有指定的数字,代表显示宽度。
技术分享

显示宽度:没有特别的含义,只是默认的告诉用户可以显示的形式而已,实际上用户是可以控制的,这种控制不会改变数据本身的大小。
技术分享

显示宽度的意义:在于当数据不够显示宽度的时候,会自动让数据编程对应的显示宽度。通常需要搭配一个前导 0 来增加宽度,不改变值大小,zerofill(零填充),零填充会导致数值会自动变成无符号。
技术分享

零填充 + 显示宽度的效果:
技术分享
零填充的意义(显示宽度):保证数据格式

小数型

小数型:带有小数点或者范围超出整型的数值类型。
SQL中:将小数型细分成两种:浮点型和定点型
浮点型:小数点浮动,精度有限,而且会丢失精度
定点型:小数点固定,精度固定,不会丢失精度

浮点型

浮点型数据是一种精度型数据,因为超出指定范围之后,会丢失精度(自动四舍五入)
浮点型:理论分为两种精度
1. Float:单精度,占用 4 个字节存储数据,精度范围大概为7位左右
2. Double:双精度,占用 8 个字节存储数据,精度范围大概为 15 位左右
技术分享

创建浮点数表:浮点的使用方式,直接 float表示没有小数部分,float(M,D):M代表总长度,D代表小数部分长度,整数部分长度为 M-D
技术分享

插入数据:可以是直接小数,也可以是科学计数法
技术分享

浮点型数据的插入:整数部分是不能超出长度的,但是小数部分可以超出长度(系统会自动四舍五入)
技术分享

结果:浮点数一定会进行四舍五入,浮点数如果是因为系统进位导致整数部分超出指定长度,那么系统也允许成立。
技术分享

定点型

定点型:绝对的保证整数部分不会被四舍五入,小数部分有可能(理论上也不会丢失精度)
技术分享

创建定点数据表:以浮点数作为对比
技术分享

插入数据:定点数的整数部分一定不能超出长度,小数部分的长度可以随意超出(四舍五入)
技术分享
浮点数如果进位导致长度超出没有问题,但是定点数不行。
技术分享
查看数据:
技术分享

===华丽的分割线===

时间日期类型

datetime:时间日期,格式 YYYY-mm-dd HH:ii:ss,表示范围是从1000 到 9999 年,有0值 0000-00-00 00::00:00
data:日期,就是 datetime 中的 date 部分
time:时间(段),指定的摸个区间之间
timestamp:时间戳,并不是时间戳,只是从 1970 年开始的 YYYY-mm-dd HH:ii:ss
year:年份,两种形式,year(2) 和 year(4)
技术分享

创建时间日期表
技术分享

插入数据:时间time可以是负数,而且可以是很大的负数,year可以使用2位数插入,也可以使用4位数
技术分享

timestamp字段:只要当前所在的记录被更新,该字段一定会自动更新
技术分享

字符串类型

在SQL中,将字符串类型分成了 6 类:char,varchar,text,blob,enum,set

定长字符串:

定长字符串:char。磁盘(二维表)在定义结构的时候,就已经确定了最终数据的存储长度

char(L):L表示可以存储的长度,单位为字符,最大长度值可以为255
char(4) 在 UTF8下,需要12个字节

变长字符串:

变长字符串:varchar。在分配空间的时候,按照最大的空间分配,但是实际上最终用了多少,是根据具体的数据来确定。

varchar(L),L的理论长度是65536个字符,但是会多出 1~2个字节来确定存储的实际长度。
varchar(10) 的确存了10个汉字,utf8下 10*3 + 1 =31(bytes)
存储 3 个汉字,3 * 3 +1 =10(bytes)

如何选择定长或者变长字符串呢?
定长的磁盘空间比较浪费,但是效率高。比如身份证,手机号,用定长
变长的磁盘空间比较节省,但是效率低。比如姓名,地址,用变长。

文本字符串

如果数据量非常大,通常说超过255个字符,就会使用文本字符串

文本字符串根据存储的数据的格式分为 text 和 blob
Text:存储文字(二进制数据实际上都是存储路径)
Blob:存储二进制数据(通常不用)

枚举字符串

枚举:enum,事先将所有可能出现的结果都设计好,实际上存储的数据必须是规定好的数据中的一个。

枚举的使用方式
定义enum可能出现的元素列表: //如:enum(‘男’,’女’,’不男不女’,’妖’,’保密’);
使用:存储数据,只能存储上面定义好的数据。

创建枚举表
技术分享
加入数据:作用之一,规范数据格式
技术分享
作用之二:节省存储空间:枚举实际存储的是数值,而不是字符串本身。
技术分享
找出了枚举元素的规律:按照元素出现的顺序,从一开始编号。
技术分享
枚举原理:枚举在进行数据规范的时候,系统会自动建立一个数字与枚举元素的对应关系(关系放到日志中),然后在进行数据插入的时候,系统自动将字符转换成对应的数字存储,然后在进行数据提取的时候,系统自动将数值转换成对应的字符串显示。

因为枚举实际存储的是数值,,所以可以直接插入数字
技术分享

集合字符串

集合跟枚举类似:实际存储的是数值,而不是字符串(集合是多选)

集合使用方式:
定义:set(元素列表)
使用:可以使用元素列表中的多个,使用逗号分割
技术分享
插入数据:可以使用多个元素字符串组合,也可以直接插入数值。
技术分享
查看数据:数值 + 数据查看
技术分享

集合中每一个元素都是对应一个对应二进制位
技术分享
集合中元素的顺序没有关系,最终系统都会去匹配顺序。

集合的强大在于能够规范数据和节省空间

Mysql 记录长度

Mysql中规定:任何一条记录最长不能超过 65535 个字节(varchar永远达不到理论值)
varchar实际存储长度能达到多少呢?看字符集编码
UTF8下varchar的实际顶配:21844
GBK下varchar的实际顶配:32766
技术分享

想用完整个65535个字节长度,增加一个tinyint字段 (not null)

Mysql中text文本字符串,不占用记录长度:额外存储,但是text文本字符串也是属于记录的一部分,一定需要占据记录中的部分长度:10个字节(保存数据的地址以及长度)
技术分享

Mysql数据类型

标签:

原文地址:http://blog.csdn.net/sinat_20645961/article/details/51901263

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!