SQL之参数类型讲解

目录

[1. bit](#1. bit)

[2. float(小数类型)](#2. float(小数类型))

[3. decimal(小数类型)](#3. decimal(小数类型))

[4. char(字符串类型)](#4. char(字符串类型))

[5. varchar(字符串类型)](#5. varchar(字符串类型))

[6. 日期和时间类型](#6. 日期和时间类型)

[7. enum和set](#7. enum和set)


1. bit

bit [(M)] : 位字段类型。 M 表示每个值的位数,范围从 1 到 64 。如果 M 被忽略,默认为 1 。
如果我们有这样的值,只存放 0 或 1 ,这时可以定义 bit(1) 。这样可以节省空间。

sql 复制代码
mysql> create table tt4 ( id int, a bit(8));
 Query OK, 0 rows affected (0.01 sec)

同时它是按照ASCII码对应的值显示。 比如下面这张图里面,65是A所对应的ASCII。

2. float(小数类型)

float [(m, d)] [ unsigned ] : m 指定显示长度, d 指定小数位数,占用空间 4 个字节

这个m的意思是小数点前面的位数加上小数点后面的个数要等于这个m,同时如果用户输入的数大于这个m的话,它会先按照四舍五入的方式尝试进化化简,如果化简结果符合这个m的话那它就显示OK,不然的话就插入失败。

我们先设置一个总长度为4,小数点后面有2位的salary。

sql 复制代码
create table tt6(id int, salary float(4,2));

在下面这张图里面-99.991,最后的一个1被四舍五入掉了。如果我们把这个1换成5,那么这边就会插入失败。

3. decimal(小数类型)

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数

这个看起来和上面那个float一样,区别在于这个decimal的精度更高。

float表示的精度大约是7位。

decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略, 默认是10

我们看下面的代码和结果,在高精度的情况下,decimal可以保持更高的精度。

sql 复制代码
mysql> create table tt8 ( id int, salary float(10,8), salary2 decimal(10,8));

4. char(字符串类型

char (L): 固定长度字符串, L 是可以存储的长度,单位为字符,最大长度值可以为 255

这个没什么好说的,就是普通的char类型,在这边写出来是为了和下面的varchar来进行对比

5. varchar(字符串类型

varchar (L): 可变长度字符串, L 表示字符长度,最大长度 65535 个字节
我们来看下面的这张图,varchar里面的L是6 ,表示这里可以存放6个字符。但是如果我们只填入5个字符的话,那它就只显示5个字符。
但是如果我们填入超过6个字符的话,那就会报错。
所以我们可以发现,这个varchar有点像那个vector,只不过这个"vetcor"的上限被L给锁定了。

那么我们在一些情况下该如何进行选择呢?

  1. 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
  2. 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
  3. 定长的磁盘空间比较浪费,但是效率高。
  4. 变长的磁盘空间比较节省,但是效率低。
  5. 定长的意义是,直接开辟好对应的空间
  6. 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。

6. 日期和时间类型

常用的日期有如下三个:

date :日期 'yyyy-mm-dd' ,占用三字节。

datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节。

timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用

四字节。

我们来看下面这张图片,其中date类型的t1就是显示年月日,datetime类型的t2就是显示年月日加上时分秒,而timestam类型的t3不用我们自己设置,它会自动给自己加上执行这条指令时的时间。

同时如果我们更新了其中的一条数据,那么timestamp 也会自动更新时间。

7. enumset

enum :枚举, " 单选 " 类型;
enum(' 选项 1',' 选项 2',' 选项 3',...);
set :集合, " 多选 " 类型;
set(' 选项值 1',' 选项值 2',' 选项值 3', ...);
他们的区别就是enum是单选,而set是多选。

我们看下面这张图片,其中set类型的hobby我们插入了两个值,而enum我们只可以插入一个。

我们看下面这张图,如果我们要查找hobby=B的,那么1和2就不会被选出来,因为这条查找是只有B的。

如果我们要查找出所有含有B的,那么我们应该用用****find_ in_ set函数。

通过这个函数我们就可以查找出所有含有B的。

相关推荐
IvorySQL4 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·4 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
野生技术架构师4 小时前
SQL语句性能优化分析及解决方案
android·sql·性能优化
IT邦德4 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫4 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i4 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.4 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn5 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露5 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot