MySql数据类型
数据类型定义了数据在数据库中的存储格式,包括数据的大小、范围、精度等。不同的数据类型具有不同的存储要求。
MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
数值类型
bit类型
BIT
类型是 MySQL 中用于存储位数据的数据类型。它可以存储固定长度的位序列,允许每个位都是 0 或 1。
BIT
类型的语法为:
BIT[(length)]
其中,length
是可选参数,指定了位序列的长度。如果省略 length
,则 BIT
类型默认长度为 1。最大为64。
使用示例
create table bit_example(
single_bit bit,
four_bits bit(4),
eight_bits bit(8)
);
创建了一个名为 bit_example
的表,其中包含三个 BIT
类型的列。single_bit
列的长度为 1,可以存储一个比特位;four_bits
列的长度为 4,可以存储四个比特位;eight_bits
列的长度为 8,可以存储八个比特位。
表结构如下:
bit类型使用注意事项
-
bit类型是按照ascii码对应的值进行显示的。10对应的比特位是4位太大了,会插入失败。11对应的ascii码是垂直制表符,12对应的是换页符。导致显示如下图。
-
虽然MySQL提供了位类型bit,但一般不建议将数据类型设置成位类型,除非将来这个数据本身就只是给程序看的,并且数据本身非常占用资源。
-
因为查询位类型数据时,默认会按照ASCII码对应的值进行显示,这对于将来数据库管理员维护数据库或程序员调试程序都是不太方便的。
-
如果我们有这样的值,只存放0或1,这时可以定义bit(1)。这样可以节省空间。
tinyint类型
TINYINT
类型是 MySQL 中的整数类型之一,用于存储小整数值。它通常用于存储较小范围的整数数据,占用较少的存储空间。
TINYINT
类型的语法为:
TINYINT[(length)] [UNSIGNED] [ZEROFILL]
其中,length
是可选参数,用于指定整数的显示宽度。如果省略 length
,则默认为 TINYINT(1)
,即只能存储一个字节的整数值(范围为 -128 到 127)。如果指定了 UNSIGNED
,则表示只能存储非负整数值(范围为 0 到 255)。ZEROFILL
表示在显示时用零填充值。
使用示例
CREATE TABLE tinyint_example (
col1 TINYINT, -- 范围为 -128 到 127
col2 TINYINT(3), -- 指定显示宽度为 3
col3 TINYINT UNSIGNED, -- 范围为 0 到 255
col4 TINYINT(2) ZEROFILL -- 显示宽度为 2,显示时用零填充值
);
表结构如下:
对表中插入数据。对于col1和col2只支持-128-127范围的数据。col3和col4支持0-255范围的数据。
尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不 下,与其如此,还不如设计时,将int类型提升为bigint类型。
float类型
FLOAT
类型用于存储单精度浮点数,它可以用来存储大范围的浮点数值,但是精度相对较低。
FLOAT
类型的语法为:
FLOAT[(M, D)]
M
表示总的位数,D
表示小数点后的位数。如果指定了 M
和 D
,则 M
表示总的位数,包括小数点前和小数点后的位数,D
表示小数点后的位数。如果省略了 M
和 D
,则默认为 FLOAT(24, 0)
。
使用示例
create table float_example(
num float(4,2)
);
创建一个float_example表,表中包含一个float(4,2)的列。
num列只支持-99.99-99.99范围的数据。超过这个范围就会插入失败。
decimal类型
DECIMAL
类型用于存储精确的小数值,它能够确保小数值的精度和范围。decimal的精度比float更高。
DECIMAL
类型的语法为:
DECIMAL(M, D)
其中,M
表示总的位数,D
表示小数点后的位数。DECIMAL
类型可以存储任意精度的小数值,范围由 M
和 D
决定。
使用示例
create table decimal_example(
num1 float(10,8),
num2 decimal(10,8)
);
创建一个decimal_example表,表中包含一个float(10,8)列和一个decimal(10,8)列。
向表中两列插入同样的数据,float类型会存在精度丢失。
字符串类型
char类型
CHAR
类型用于存储固定长度的字符串,其长度在创建表时指定,并且在所有情况下都会占用指定长度的存储空间,不论实际存储的字符串长度是多少。
CHAR
类型的语法为:
CHAR(length)
length
是指定的字符串长度,可以是 0 到 255 之间的整数。
使用示例
create table char_example(
name char(20)
);
表的结构:
只能向该列插入20个字符以下的字符串。大于20字符就会出错。
varchar类型
VARCHAR
类型用于存储可变长度的字符串。与 CHAR
类型不同,VARCHAR
类型的存储空间取决于存储的实际数据长度,而不是固定的。相比于 CHAR
类型,它更加节省存储空间。
VARCHAR
类型的语法为:
VARCHAR(length)
其中,length
是可选参数,用于指定字符串的最大长度。
使用示例
create table varchar_example(
name varchar(20) --表示可以存放20字符
);
表的结构
关于VARCHAR(length)的length到底多大和表的编码有关系
- varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字 节数是65532。
- 当编码是uft8 时,varchar(n)的参数n最大值是65532/3=21844(因为utf中,一个字符占 用3个字节)
- 如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符 占用2字节)。
下面验证了utf8编码length最大是21844
char和varchar的比较
如何选取char或者varchar
- 如果要存储的数据是定长的,那就使用char类型进行存储,比如身份证号码、手机号、md5等。
- 如果要存储的数据是变长的,那就使用varchar类型进行存储,比如名字、地址等。
- char类型的数据是定长的,因此磁盘空间比较浪费,但是效率高(直接访问定长的空间)。
- varchar类型的数据是变长的,因此磁盘空间比较节省,但是效率低(需要先读取存储字符串的长度,再访问指定长度的空间)。
时间和日期类型
常用的日期有如下三个:
- DATE 类型: 用于存储日期,格式为 ‘YYYY-MM-DD’,例如 ‘2024-04-30’。
- DATETIME 类型: 用于存储日期和时间,格式为 ‘YYYY-MM-DD HH:MM:SS’,例如 ‘2024-04-30 12:34:56’。
- TIMESTAMP类型 :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节。
使用示例
create table date_example(
t1 date,
t2 datetime,
t3 timestamp
);
表的结构:
向表中添加数据时时间戳会自动更新
更新数据时,时间戳也会自动更新
timestamp类型使用案例
- 创建一个评论表,表当中包含评论人的昵称、评论的内容和评论的发布时间。
create table comment_tb(
name varchar(20),
content text(100),
rtime timestamp
);
2.向评论表中插入记录时,只需要指明评论人的昵称和评论的内容,评论的发布时间默认会设置成该记录的插入时间。如下:
3. 当更新评论时,时间戳也会自动更新。
enum和set类型
ENUM
和 SET
是用于存储枚举值集合的数据类型。
- ENUM 类型:
ENUM
类型用于存储枚举值集合中的一个单一值。它允许你从一个预定义的枚举值列表中选择一个值存储在列中。枚举值列表由单引号括起来,用逗号分隔。
使用示例
create table enum_test(
status enum('active','inactive')
);
status
列只能存储 'active'
、`'inactive’这两个值的其中一个。
- SET 类型:
SET
类型用于存储枚举值集合中的一个或多个值。与ENUM
类型不同,SET
类型允许你选择多个值存储在列中。枚举值列表同样由单引号括起来,用逗号分隔。
使用示例
create table set_test(
role set('admin','editor')
);
使用案例
有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选), (男,女)(单选)
- 创建调查表
CREATE TABLE votes (
name VARCHAR(20),
hobby SET('游泳', '篮球', '爬山', '武术'),
sec ENUM('男', '女')
);
- 插入数据
这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535 个;当我们添加枚举值时,也可以添加对应的数字编号。不过不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。