MySQL 数据类型
Posted 小倪同学 -_-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 数据类型相关的知识,希望对你有一定的参考价值。
文章目录
数据类型分类
数值类型
tinyint类型
tinyint 取值范围类似C/C++中的char类型,但是输入的值超出范围时,mysql不会像C/C++发生截断,而是直接报错,演示如下
说明:
- 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。
- 可以通过UNSIGNED来说明某个字段是无符号的。
create table tt2(num tinyint unsigned);
为什么MySQL不让插入呢?
mysql是一个专门用来进行数据管理的软件,需要做到非常严谨,保证MySQL内的数据具有非常强的确定性和一致性让使用者,严格按照MySQL的要求进行数据表中类型的设计与使用,类型本质上是一种约束。
bit类型
bit[(M)] : 位字段类型。M表示每个值的位数,M的范围为1到64。如果M被忽略,默认为1。
注意:bit字段在显示时,是按照ASCII码对应的值显示。
例:
例如 bit(2) 可插入的数为 0 1 2 3。
bool类型
bool类型的底层就是tinyint类型
float
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
例:小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。
如果定义的是float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99。
常见的取整方案
- 0向取整
不管小数为多少,都向0的方向取整
例: 2.5 -> 2 , -2.5 -> -2。
取模运算中就用这种取整方法
- 向下取整
不管小数为多少,都向下取整
例: 2.7 -> 2 , -2.7 -> -3 ,2.3 -> 2 , -2.3 -> -3。
- 向上取整
不管小数为多少,都向上取整
例: 2.7 -> 3 , -2.7 -> -2 ,2.3 -> 3 , -2.3 -> -2。
- 四舍五入取整
例: 2.7 -> 3 , -2.7 -> -3 ,2.3 -> 2 , -2.3 -> -2。
decimal
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
decimal 和 float 的用法几乎一样,区别是精度不同
float表示的精度大约是7位。decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0,如果m被省略,默认是10。
现decimal的精度更准确,因此如果我们希望某个数据表示高精 度,选择decimal。
字符串类型
char
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过2个, 最多只能是255
varchar
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
说明:
varchar(len),len到底是多大,这个len值,和表的编码密切相关:
- varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。
- 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844(utf中,一个字符占用3个字节(汉字)),如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(gbk中,一个字符占用2字节)。
验证:
char和varchar比较
那么如何选择定长或变长字符串?
- 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
- 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
- 定长的磁盘空间比较浪费,但是效率高。
- 变长的磁盘空间比较节省,但是效率低。
- 定长的意义是,直接开辟好对应的空间。
- 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。
日期和时间类型
常用的日期有如下三个:
- date :日期 ‘yyyy-mm-dd’ ,占用三字节
- datetime 时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 ,占用八字节
- timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
now可表示当前时间
更新数据:
enum和set
- enum:枚举,“单选”类型;
enum(‘选项1’,‘选项2’,‘选项3’,…);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。
- set:集合,“多选”类型;
set(‘选项值1’,‘选项值2’,‘选项值3’, …);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,… 最多64个。
不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。
例:
设计一个调查表votes,需要调查人的喜好, 在(登山,游泳,篮球,武术)中去选择(可以多选);表格中还有性别(男,女)[单选];姓名。
查询
find_ in_ set函数
集合查询需要使用find_ in_ set函数
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0; str_list 用逗号分隔的字符串。
现在查询上文表格中有登山爱好的人
现在再思考一个问题:为什么MySQL要有数据类型
1.因为MySQL将来第一件事情是要建表,所谓的表,本质是一种或多种数据的集合。(mysql中的表,类似C中struct,类似C++中的class,本质也是通过表,来描述被管理对象,本质是不是在描述对象的属性,数据化之后,就是类型 )
2.数据类型本质是一种约束,因为强约束的存在,会保证mysql表中的数据将来具有非常强的一致性和确定性,不会因为上层数据的改变,而影响表中数据。
以上是关于MySQL 数据类型的主要内容,如果未能解决你的问题,请参考以下文章