标签:
所谓的数据类型:对数据进行统一的分类。从系统的角度出发,是为了使用统一的方式进行管理,更好的利用有限的空间。
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中规定:任何一条记录最长不能超过 65535 个字节(varchar永远达不到理论值)
varchar实际存储长度能达到多少呢?看字符集编码
UTF8下varchar的实际顶配:21844
GBK下varchar的实际顶配:32766
想用完整个65535个字节长度,增加一个tinyint字段 (not null)
Mysql中text文本字符串,不占用记录长度:额外存储,但是text文本字符串也是属于记录的一部分,一定需要占据记录中的部分长度:10个字节(保存数据的地址以及长度)
标签:
原文地址:http://blog.csdn.net/sinat_20645961/article/details/51901263