数据库

MySQL字符类型

2018-09-12  本文已影响7人  乔治大叔

列类型

类型 字节数 有符号型范围 无符号型范围(unsigned)
tinyint(M) 1字节 -128~127 0~255
smallint(M) 2字节 -32768~32767 0~65535
mediumint(M) 3字节 -8388608~8688607 16777215
int(M) 4字节 -2147483648~2147483647 4294967295
integer 4字节
bigint(M) 8字节 -9223372036854775808~9223372036854775807
float(X) 浮点型 4 -3.4E38~3.4E38(7个有效位) 如果 X < = 24 或 8 如果 25 < = X < = 53
float 4 个字节
double 双精度实型 8 个字节 -1.7E308~1.7E308(15个有效位)
double precision 8 个字节
real 8 个字节
decimal(M,D)数字型 M字节(D+2 , 如果M < D) 128bit,不存在精度损失,常用于银行帐目计算(28个有效位)
numeric(M,D) M字节(D+2 , 如果M < D)

日期和时间类型

类型 字节数
DATE 3 个字节
DATETIME 8 个字节
TIMESTAMP 4 个字节
TIME 3 个字节
YEAR 1 字节

字符串类型

类型 字节数和范围
CHAR(M) M字节,1 <= M <= 255
VARCHAR(M) L+1 字节, 在此L <= M和1 <= M <= 255
TINYBLOB, TINYTEXT L+1 字节, 在此L< 2 ^ 8
BLOB, TEXT L+2 字节, 在此L< 2 ^ 16
MEDIUMBLOB, MEDIUMTEXT L+3 字节, 在此L< 2 ^ 24
LONGBLOB, LONGTEXT L+4 字节, 在此L< 2 ^ 32
ENUM(‘value1’,’value2’,…) 1 或 2 个字节, 取决于枚举值的数目(最大值65535)
SET(‘value1’,’value2’,…) 1,2,3,4或8个字节, 取决于集合成员的数量(最多64个成员)

1 整型
如何验证存储的数据范围 ? 编程计算机 或者 python代码
⽆符号与有符号为什么⼤大⼩小不同? 因为需要用⼀个bit存储符号
默认是有符号好使⽆符号呢?
来⼀个测试,创建表 添加tinyint类型字段 插⼊255 发现最大还是127 说明
默认是有符号的 如何设置有符号?
创建表是在数据类型后⾯添加unsigned 选择哪个来使用呢?
常规int就⾜够使⽤了
全⽤bigint也行 只不过会多占一些空间,但是硬盘好像也不值钱 ⽽而且对你的程序运行速度没啥影响
最好是根据你的实际情况 ⽐如存年龄tinyint就最够
思考: 可以给整型加上宽度限制吗? 可以,尝试一下,在建表时 为int指定宽度为更大的范围
插⼊超过int范围的数据
查看结果 发现任然只能存储4字节最大值
也就是说: 整型的数据能保存的数据范围由数据类来决定
那么宽度对于整型⽽言有什么意义吗?
对于整型⽽言 宽度用于控制显示的长度
例如 int(10) 则表示显示的时候 如果不足10位则不足10位
尝试一下 发现没什么⽤ 因为你仅仅告诉她需要填充10位 并没有说⽤什么 填充
所以 要控制显示宽度 不仅需要指定宽度还要指定 zerofill 以0填充 有没有发现⼀个问题 我们之前创建的表并没有指定显示宽度 那他有没有呢?
desc查看一下
有⽽且刚好就是 能够存储的最大范围的长度 所以如果你使用的是整型 则
没有必要指定显示宽度

2浮点
float(m,d) 4字节
double(m,d) 8字节
decimal(m,d) 根据长度确定
在浮点类型中 后面的m表示整体⻓度 d表示小数长度 注意:是长度和字节数⽆关 那么整数部分的长度就是m-d
例例如 float(5,3) 最⼤能存出 99,999
三种类型的区别
相同处: ⼩数部分最大精度都是30 不同处:
1.float double 总长度最大为255
2.float double 都是不清准的小数 decimal是精准的 3.double的精度⽐float⾼一些
如何取舍根据实际情况 如果对精度要求⾼ 比如银行系统 就是用decimal 否则一般使用float
3char和varchar
宽度⽤于限制字符的长度(字符数) char 为定⻓
超出范围则报错 不足则用空格在右边补⾜长度 varchar为变⻓
超出范围则报错 不足则有几个字符就存几个
测试:
create table t10(a char(4),b varchar(4)); insert into t10 values("a","a");
select *from t10;
decimal为65

发现并没有区别!
介绍一个函数 lenght(列名) 可以查询某⼀列的长度 select char_length(a),char_length(b) from t10; 发现⻓度也相同!
这是为什么?
因为mysql⾃动把后面的空格给干掉了了! 那怎么能看一下呢?
需要修改sql_mode 增加 PAD_CHAR_TO_FULL_LENGTH set global sql_mode =
"PAD_CHAR_TO_FULL_LENGTH,STRICT_TRANS_TABLES" 再次查看:select char_length(a),char_length(b) from t10; 由此可以看出定长的char mysql的确⾃动将后⾯面的空格处理掉了
再来看一个例子:
create table t5(name char(4)); insert into t5 value("yh") insert into t5 value("egon")
select *from t5 where name = "yh "
无论后面有多少个空格都会⾃动去掉
换⼀种写法:
select *from t5 where name =like "yh " 此时就不行了 自动去除空格仅在第一种写法中生效
总结:使⽤用char类型时 如果数据长度不足则会⾃动补⾜ 在读取数据时 mysql会自动去除其中的空格
因为这是mysql内部的一个存储机制 与我们的应⽤程序逻辑⽆关
注意的是 如果数据不足规定长度 使用like 来模糊匹配时 硬盘上存储 的空格也算作有效字符
所以我们应该在后面加上% 表示后面任意长度的字符都匹配 像这样 :select *from t5 where name =like "yh%" 当然你也可以使用_ 表示一个任意字符 模糊匹配后续会详细讲

如何抉择?
你觉得那种类型好呢? 到底哪种好我们得分析一下 相同点:都是字符类型 不同点:
1.char 是固定长度 会浪费空间 存取速度快
2.varchar 是可变长度 节省空间
存取速度慢 思考 可变长度如何实现?
假设我们有两个类型 char(4)
存储: axx bx bbbbcccc varcahr(4)
存储:axxbxbbbbcccc
如何取出某个名字?
需要在前面保存字符串的长度 (1btyes+axx)(1bytes+bx)(1bytes+bbbb)(1bytes+cccc) 长度最⼤为两个字节2bytes
这就意味着 一些情况下 varchar更占用空间 并且需要计算字符串长度 所以存取速度慢

TIMESTAMP 自带默认状态,默认时间就是当前时间

上一篇下一篇

猜你喜欢

热点阅读