列类型学习
mysql 三大列类型
整型
Tinyint/ smallint/ mediumint/int/ bigint(M) unsigned zerofill
字符串型
Char(M)
Varchar(M)
Text 文本类型
日期时间类型
Date 日期
Time 时间
Datetime 时间时间类型
Year 年类型
整形:
整型系列所占字节与存储范围的关系 .
定性 : 占字节越多 , 存储范围越大 .
下图 : 是具体的数字分析
Tinyint 1 个字节 8 个位 0 - 2^8-1 , 0-255
-2^7 ----> +2^7-1
分析 :
Smallint 2 个字节 , 16 位 0----2^16-1 = 65535
-2^15 ---> +2^15-1, -32768 -> 32767
一般而言 , 设某类型 N 字节
N 字节 , 8N 位 .
0 ----> 2^8N-1
-2^(8N-1) ---> +2^(8N-1) -1;
对于 int 型 : 占的字节越多 , 存储的范围也越大 .
整型系统的可选参数 : XXint(M) unsigned zerofill
例 : age tinyint(4) unsigned , 或者 stunum smallint(6) zerofill;
Unsigned: 代表此列为无符号类型 , 会影响到列的存储范围 . ( 范围从 0 开始 )
( 不加 unsinged, 则该列默认是有符号类型 , 范围从负数开始 )
Zerofill: 代表 0 填充 , 即 : 如果该数字不足参数 M 位 , 则自动补 0, 补够 M 位 .
1: 如果没有 zerofill 属性 , 单独的参数 M, 没有任何意义 .
2: 如果设置某列为 zerofill, 则该列已经默认为 unsigned, 无符号类型 .
小数型
Float(M,D),decimal(M,D)
M 叫 " 精度 " ----> 代表 " 总位数 ", 而 D 是 " 标度 ", 代表小数位 .( 小数右边的位数 )
浮点数占多大的空间呢
答: float 能存 10 ^38 , 10^-38
如果 M<=24, 点 4 个字节 , 否则占 8 字节
用来表示数据中的小数 , 除了 float--- 浮点 .
还有一种叫定点 decimal, 定点是把整数部分 , 和小数部分 , 分开存储的 .
比 float 精确 , 他的长度是变化的 .
空间上的区别 :
Float(M,D), M<=24, 4 个字节 , 24 <M <=53, 8 个字节
Decimal () , 变长字节 .
区别 : decimal 比 float 精度更高 , 适合存储货币等要求精确的数字 ,
见下例 :
字符串性:
Mysql 字符串类型
Char 定长类型
Char(M) , M 代表宽度 , 0<=M<=255 之间
例 :Char(10) , 则能输入 10 个字符 .
Varchar 变长类型
Varchar(M), M 代表宽度 , 0<=M<=65535( 以 ascii 字符为例 ,utf822000 左右 )
0000000000
00\0\0\0\0\0 (char 型 , 如果不够 M 个字符 , 内部用空格补齐 , 取出时再把 右侧空格 删掉 )
注 : 这意味着 , 如果右侧本身有空格 , 将会丢失 .
通过concat函数可以验证!
M 代表字符长度,和是否是汉字和字母无关。
Blob, 是二进制类型 , 用来存储图像 , 音频等二进制信息 .
意义 : 2 进制 ,0-255 都有可能出现 .
Blob 在于防止因为字符集的问题 , 导致信息丢失 .
比如 : 一张图片中有 0xFF 字节 , 这个在 ascii 字符集认为非法 , 在入库的时候 , 被过滤了 .
enum选择一个,set选择多个
日期时间类型
Year 年 (1 字节 ) 95/1995, [1901-2155],
在 insert 时 , 可以简写年的后 2 位 , 但是不推荐这样 .
[00-69] +2000
[70-99] + 1900,
即 : 填 2 位 , 表示 1970 - 2069
Date 日期 1998-12-31
范围 : 1000/01/01 ,9999/12/31
Time 时间 13:56:23
范围 : -838:59:59 -->838:59:59
datetime
时期时间
1998-12-31 13:56:23
范围 : 1000/01//01 00:00:00 ---> 9999:12:31 23:59:59
timestamp
时间戳 :
是 1970-01-01 00:00:00 到当前的秒数 .
一般存注册时间 , 商品发布时间等 , 并不是用 datetime 存储 , 而是用时间戳 .
因为 datetime 虽然直观 , 但计算不便 .