目录
一、MySQL中的数据类型
常见数据类型的属性
关于属性
1.创建数据库时指明字符集
2.创建表的时候,指明表的字符集
3.创建表,指明表中的字段时,可以指定字段的字符集
二、整数类型
(一)可选属性
1.M
2.UNSIGNED
3.ZEROFILL
(二)适用场景
三、浮点类型
数据精度说明
四、定点数类型
五、位类型
使用SELECT命令查询位字段时,可以用BIN()或HEX()函数进行读取
六、日期与时间类型
1.YEAR类型
在MySQL中,YEAR有以下几种存储格式
2.DATE类型
3.TIME类型
向TIME类型的字段插入数据时,可以使用的格式
4.DATETIME类型
在向DATETIME类型的字段插入数据时,需要满足的格式条件
5.TIMESTAMP类型
⚪TIMESTAMP和DATETIME的区别
七、文本字符串类型
1.CHAR与VARCHAR类型
①CHAR类型
②VARCHAR类型
⚪哪些情况使用 CHAR 或 VARCHAR 更好
2. TEXT类型
八、ENUM类型
九、SET类型
十、二进制字符串类型
1.BINARY与VARBINARY类型
2.BLOB类型
十一、JSON类型
当需要检索JSON类型的字段中数据的某个具体值时,可以使用“->”和“->>”符号
十二、空间类型
常见的几何图形元素
多个同类或异类几何图形元素的组合
CHARACTER SET name
CREATE DATABASE IF NOT EXISTS dbtest12 CHARACTER SET 'utf8';
SHOW CREATE DATABASE dbtest12;
CREATE TABLE temp(
id INT
)CHARACTER SET 'utf8';
SHOW CREATE TABLE temp;
CREATE TABLE temp1(
id INT,
`name` VARCHAR(15) CHARACTER SET 'gbk'
);
SHOW CREATE TABLE temp1;
整数类型一共有 5 种,包括 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和 BIGINT。
表示显示宽度,M的取值范围是(0, 255)。
例如,int(5):当数据宽度小于5位的时候在数字前面需要用 字符填满宽度。该项功能需要配合“ ZEROFILL ”使用,表示用“0”填满宽度,否则指定显示宽度无效。
在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。 int(3)、int(4)、int(8) 在磁盘上都 是占用 4 bytes 的存储空间
CREATE TABLE test_int2(
f1 INT,
f2 INT(5),
f3 INT(5) ZEROFILL #显式宽度为5,当insert的值不足5位时,使用0填充
);
INSERT INTO test_int2(f1,f2)
VALUES(123,123),(123456,123456);
INSERT INTO test_int2(f3)
VALUES(123),(123456);
SELECT * FROM test_int2;
无符号类型(非负),所有的整数类型都有一个可选的属性UNSIGNED(无符号属性),无 符号整数类型的最小取值为0。所以,如果需要在MySQL数据库中保存非负整数值时,可以将整数类型设 置为无符号类型。
int类型默认显示宽度为int(11),无符号int类型默认显示宽度为int(10)。
CREATE TABLE test_int3(
f1 INT UNSIGNED
);
0填充,(如果某列是ZEROFILL,那么MySQL会自动为当前列添加UNSIGNED属性),如果指 定了ZEROFILL只是表示不够M位时,用0在左边填充,如果超过M位,只要不超过数据存储范围即可。
当使用ZEROFILL时,会自动添加UNSIGNED
CREATE TABLE test_decimal1(
f1 DECIMAL,
f2 DECIMAL(5,2)
);
DESC test_decimal1;
INSERT INTO test_decimal1(f1)
VALUES(123),(123.45);#存在四舍五入
SELECT * FROM test_decimal1;
INSERT INTO test_decimal1(f2)
VALUES(999.99);
BIT类型中存储的是二进制值,类似010110。
BIT类型,如果没有指定(M),默认是1位。这个1位,表示只能存1位的二进制值。这里(M)是表示二进制的位数,位数最小值为1,最大值为64。
CREATE TABLE test_bit1(
f1 BIT,
f2 BIT(5),
f3 BIT(64)
);
INSERT INTO test_bit1(f1)
VALUES(1);
#Data too long for column 'f1' at row 1
INSERT INTO test_bit1(f1)
VALUES(2);
INSERT INTO test_bit1(f2)
VALUES(23);
类型、名称、字节、日期格式、最小值、最大值
CREATE TABLE test_year(
f1 YEAR,
f2 YEAR(4)
);
DESC test_year;
INSERT INTO test_year(f1)
VALUES('2022'),(2023);
SELECT * FROM test_year;
INSERT INTO test_year(f1)
VALUES('2155');
INSERT INTO test_year(f1)
VALUES('2156');# Out of range value for column 'f1' at row 1
INSERT INTO test_year(f1)
VALUES('69'),('70'); #69:2069 70:1970
INSERT INTO test_year(f1)
VALUES(0),('00'); #0:0000 '00':2000
CREATE TABLE test_date1(
f1 DATE
);
DESC test_date1;
INSERT INTO test_date1
VALUES
('2020-10-01'),
('20201001'),
(20201001);
INSERT INTO test_date1
VALUES
( '00-01-01' ),
( '000101' ),
( '69-10-01' ),
( '691001' ),
( '70-01-01' ),
( '700101' ),
( '99-01-01' ),
( '990101' );
INSERT INTO test_date1
VALUES (CURRENT_DATE()), (NOW()); #添加当前的时间
SELECT * FROM test_date1;
CREATE TABLE test_time1(
f1 TIME
);
DESC test_time1;
INSERT INTO test_time1
VALUES('2 12:30:29'), ('12:35:29'), ('12:40'), ('2 12:40'),('1 05'), ('45');
INSERT INTO test_time1
VALUES ('123520'), (124011),(1210); #123520 12:35:20
INSERT INTO test_time1
VALUES (NOW()), (CURRENT_TIME());
SELECT * FROM test_time1;
CREATE TABLE test_datetime1(
dt DATETIME
);
INSERT INTO test_datetime1
VALUES ('2021-01-01 06:50:30'), ('20210101065030');
INSERT INTO test_datetime1
VALUES ('99-01-01 00:00:00'), ('990101000000'), ('20-01-01 00:00:00'), ('200101000000');
INSERT INTO test_datetime1
VALUES (20200101000000), (200101000000), (19990101000000), (990101000000);
INSERT INTO test_datetime1
VALUES (CURRENT_TIMESTAMP()), (NOW());
SELECT * FROM test_datetime1;
存储数据的时候需要对当前时间所在的时区进行转换,查询数据的时候再将时间转换回当前的时区。因此,使用 TIMESTAMP 存储的同一个时间值,在不同的时区查询时会显示不同的时间。
CREATE TABLE test_timestamp1(
ts TIMESTAMP
);
INSERT INTO test_timestamp1
('990101030405');
INSERT INTO test_timestamp1
VALUES ('2020@01@01@00@00@00'), ('20@01@01@00@00@00');
INSERT INTO test_timestamp1
VALUES (CURRENT_TIMESTAMP()), (NOW());
#Incorrect datetime value
INSERT INTO test_timestamp1
VALUES ('2038-01-20 03:14:07');
SELECT * FROM test_timestamp1;
用得最多的日期时间类型,就是 DATETIME 。虽然 MySQL 也支持 YEAR(年)、 TIME(时间)、 DATE(日期),以及 TIMESTAMP 类型,但是在实际项目中,尽量用 DATETIME 类型。因为这个数据类型 包括了完整的日期和时间信息,取值范围也最大,使用起来比较方便。毕竟,如果日期时间信息分散在 好几个字段,很不容易记,而且查询的时候,SQL 语句也会更加复杂。 此外,一般存注册时间、商品发布时间等,不建议使用DATETIME存储,而是使用 时间戳 ,因为 DATETIME虽然直观,但不便于计算。
MySQL中,文本字符串总体上分为 CHAR 、 VARCHAR 、 TINYTEXT 、 TEXT 、 MEDIUMTEXT 、 LONGTEXT 、 ENUM 、 SET 等类型。
CHAR和VARCHAR类型都可以存储比较短的字符串。
CREATE TABLE test_char1(
c1 CHAR, #未指明具体长度:默认只能存一个字符
c2 char(5)
);
DESC test_char1;
INSERT INTO test_char1(c1)
VALUES('a');
INSERT INTO test_char1(c1)
VALUES('ab');#Data too long for column 'c1' at row 1
INSERT INTO test_char1(c2)
VALUES('ab');
INSERT INTO test_char1(c2)
VALUES('hello');
SELECT * FROM test_char1;
CREATE TABLE test_varchar3(
NAME VARCHAR(5)
);
TEXT用来保存文本类型的字符串
由于实际存储的长度不确定,MySQL 不允许 TEXT 类型的字段做主键。遇到这种情况,你只能采用 CHAR(M),或者 VARCHAR(M)。
TEXT文本类型,可以存比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用CHAR, VARCHAR来代替。还有TEXT类型不用加默认值,加了也没用。而且text和blob类型的数据删除后容易导致 “空洞”,使得文件碎片比较多,所以频繁使用的表不建议包含TEXT类型字段,建议单独分出去,单独用 一个表。
ENUM类型也叫作枚举类型,ENUM类型的取值范围需要在定义字段时进行指定。设置字段值时,ENUM 类型只允许从成员中选取单个值,不能一次选取多个值。 其所需要的存储空间由定义ENUM类型时指定的成员个数决定。
CREATE TABLE test_enum(
season ENUM('春','夏','秋','冬','unknow')
);
INSERT INTO test_enum
VALUES('春'),('秋');
# 忽略大小写
INSERT INTO test_enum
VALUES('UNKNOW');
# 允许按照角标的方式获取指定索引位置的枚举值
INSERT INTO test_enum
VALUES('1'),(3);
# Data truncated for column 'season' at row 1
INSERT INTO test_enum
VALUES('ab');
# 当ENUM类型的字段没有声明为NOT NULL时,插入NULL也是有效的
INSERT INTO test_enum
VALUES(NULL);
SELECT * FROM test_enum;
CREATE TABLE test_set(
s SET ('A', 'B', 'C')
);
INSERT INTO test_set (s)
VALUES ('A'), ('A,B');
#插入重复的SET类型成员时,MySQL会自动删除重复的成员
INSERT INTO test_set (s)
VALUES ('A,B,C,A');
#向SET类型的字段插入SET成员中不存在的值时,MySQL会抛出错误。
INSERT INTO test_set (s)
VALUES ('A,B,C,D');#Data truncated for column 's' at row 1
SELECT *
FROM test_set;
MySQL中的二进制字符串类型主要存储一些二进制数据,比如可以存储图片、音频和视频等二进制数据。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式 。简洁和清晰的层次结构使得 JSON成为理想的数据交换语言。它易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式。
CREATE TABLE test_json(
js json
);
INSERT INTO test_json (js)
VALUES ('{"name":"songhk", "age":18, "address":{"province":"beijing",
"city":"beijing"}}');
SELECT * FROM test_json;
SELECT
js -> '$.name' AS NAME,
js -> '$.age' AS age ,
js -> '$.address.province' AS province,
js -> '$.address.city' AS city
FROM test_json;