MySQL 数据类型可以分为三大类:
CHAR、VARCHAR、TEXT 等。DATE、DATETIME、TIMESTAMP 等。数值类型在 MySQL 中主要有整型和小数型两种类型。
tinyint 类型是一个小的整数类型,通常用于存储小范围的整数。
示例:
CREATE TABLE tt1 (num tinyint);
INSERT INTO tt1 VALUES(1); -- 成功插入
INSERT INTO tt1 VALUES(128); -- 报错,超出范围有符号正数:

有符号负数:

无符号数:

bit 类型用于存储位字段,可以存储二进制数据。
示例:
CREATE TABLE tt4 (id INT, a BIT(8));
INSERT INTO tt4 VALUES(10, 10); -- 存入10,显示可能是位二进制值(bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。)
bit(8) 表示存储 8 位的二进制数。bit 类型在存储时会显示为 ASCII 字符。
注:bit字段在显示时,是按照ASCII码对应的值显示

float 类型用于存储浮动的小数值,支持四舍五入。
float(M, D) 来定义精度和小数位数,其中 M 为总位数,D 为小数位数。示例:
CREATE TABLE tt6 (id INT, salary FLOAT(4, 2));
INSERT INTO tt6 VALUES(100, -99.99); -- 成功插入
INSERT INTO tt6 VALUES(101, -99.991); -- 会进行四舍五入,存储为 -99.99案例: 小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。

如果是无符号数的float,其中的负数部分会被舍去。例如:
无符号小数:float(4,2)表示的范围是0 ~ 99.99,MySQL在保存值时会进行四舍五入。
decimal 类型是定点数,精度更高,适用于需要精确存储小数的情况。
decimal(M, D) 表示最多可以存储 M 位数,其中 D 位是小数部分。示例:
CREATE TABLE tt7 (id INT, salary DECIMAL(5, 2));
INSERT INTO tt7 VALUES(100, 99.99); -- 成功插入注: decimal类型和float类型很像,他们都支持四舍五入,他们的无符号类型都是舍去负数,但是decimal类型的精度比float类型更高。
例如:

char 是固定长度的字符串类型,适用于存储长度固定的字符串数据。
L 最大为 255 字符。示例:
CREATE TABLE tt9 (id INT, name CHAR(2));
INSERT INTO tt9 VALUES(100, 'ab'); -- 成功插入
INSERT INTO tt9 VALUES(101, '中国'); -- 成功插入varchar 是可变长度的字符串类型,适用于存储长度不固定的字符串数据。
示例:
CREATE TABLE tt10 (id INT, name VARCHAR(6));
INSERT INTO tt10 VALUES(100, 'hello'); -- 成功插入
INSERT INTO tt10 VALUES(100, '我爱你,中国'); -- 成功插入请思考为什么会出现这种情况?

原因是:CHAR 和 VARCHAR 类型在 MySQL 中存储的是字符而非字节。在默认的 utf8 字符集下,每个字符通常占用 3 个字节。由于 VARCHAR 是可变长度的字符串类型,它不仅存储字符本身,还需要额外的空间来记录实际数据的长度。因此,在 utf8 编码下,VARCHAR 字段的最大字符数是 21844。这个限制是因为 VARCHAR 的最大字节数为 65535 字节,而每个字符占用 3 个字节,再加上存储长度的开销(最多 3 个字节),因此实际能存储的最大字符数为 65535 / 3 = 21845,减去存储长度所需的空间后,最终可以存储最多 21844 个字符。
1.3.3charVSvarchar

如何选择定长或变长字符串? 定长(
CHAR): 如果数据的长度确定且不会变化,使用定长(CHAR)类型更为合适。例如:身份证、手机号、MD5 值等。 变长(VARCHAR): 如果数据的长度有变化,可以使用变长(VARCHAR)类型。例如:名字、地址等数据。 优缺点对比:
定长(CHAR):
优点:
缺点:
CHAR(10) 存储 3 个字符的数据时,会浪费 7 个字符的空间。 变长(VARCHAR):
优点:
缺点:
CHAR 稍慢。常用的日期和时间类型:
'yyyy-mm-dd'。'yyyy-mm-dd HH:ii:ss'。
enum 类型用于存储“单选”项。每个选项都有一个数字编号,对应存储在数据库中的实际值。
示例:
CREATE TABLE votes (username VARCHAR(30), gender ENUM('男', '女'));
INSERT INTO votes VALUES('张三', '男');
enum里面的值默认下表从0开始,0表示空NULL
set 类型用于存储“多选”项,可以选择多个值,值的组合会以数字标识。
示例:
CREATE TABLE votes (username VARCHAR(30), hobby SET('登山', '游泳', '篮球', '武术'));
INSERT INTO votes VALUES('雷锋', '登山,游泳');
爱好: | 爬山 | 登月 | 打球 | 游泳 | 睡觉 |
|---|---|---|---|---|---|
6 | 0 | 1 | 1 | 0 | 0 |
5 | 1 | 0 | 1 | 0 | 0 |
原因: SET 类型中的值是按二进制位存储的,每个选项对应一个二进制位。每个选项的值会用一个数字表示,数字的每一位代表一个选项的状态(是否选中)。这样可以节省存储空间。
find_in_set(sub, str_list) 函数用于查找一个字符串是否在由逗号分隔的字符串列表中。
sub 在 str_list 中,返回其位置(下标)。sub 不在 str_list 中,返回 0。示例:
find_in_set('a', 'a,b,c') 返回 1,表示 'a' 在 'a,b,c' 中的第一个位置。find_in_set('d', 'a,b,c') 返回 0,表示 'd' 不在 'a,b,c' 中。
同时它可以让查找更方便
