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。

常见的取整方案

  1. 0向取整

不管小数为多少,都向0的方向取整
例: 2.5 -> 2 , -2.5 -> -2。
取模运算中就用这种取整方法

  1. 向下取整

不管小数为多少,都向下取整
例: 2.7 -> 2 , -2.7 -> -3 ,2.3 -> 2 , -2.3 -> -3。

  1. 向上取整

不管小数为多少,都向上取整
例: 2.7 -> 3 , -2.7 -> -2 ,2.3 -> 3 , -2.3 -> -2。

  1. 四舍五入取整

例: 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

  1. enum:枚举,“单选”类型;
    enum(‘选项1’,‘选项2’,‘选项3’,…);

该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。

  1. 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 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

在 jsp/servlet 中将调查数据插入 mySql 数据库

存储调查结果 - Mysql 还是 NoSQL?

java 之数据类型

mysql 查表失败

MySQL错误代码速查表汇总

程序的砖瓦------变量与数据类型(06)