【MySQL】 数据类型

民工心事  金牌会员 | 2025-2-12 11:16:53 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 998|帖子 998|积分 2994

欢迎拜访:雾里看山-CSDN博客
本篇主题:【MySQL】 数据类型
发布时间:2025.1.27
隶属专栏:MySQL
  


  
数据类型分类

三列表格
分类数据类型说明
数值类型
bit(M)位类型。M指定位数,默认值为1,范围是1-64。
bool使用0和1表示真和假
tinyint [unsigned]带符号的范围-128 ~ 127 。无符号范围0 ~ 255。默认有符号。
smallint [unsigned]带符号的范围-215 ~ 215-1。无符号范围0 ~ 216-1。默认有符号。
int [unsigned]带符号的范围-231 ~ 231-1。无符号范围0 ~ 232-1。默认有符号。
bigint [unsigned]带符号的范围-263 ~ 263-1。无符号范围0 ~ 264-1。默认有符号。
float[(M,D)] [unsigned]M指定表现长度,D表现小数位数,占用4字节。
double[(M,D)] [unsigned]比float精度更大的小数。M指定表现长度,D表现小数位数,占用8字节。
decimal[(M,D)] [unsigned] M指定表现长度,D表现小数位数
文本、二进制类型
char(size)固定长度字符串,最大255
varchar(size)可变长度字符串,最大长度65535
blob二进制数据
text大文本,不支持全文索引,不支持默认值
日期类型
dateyyyy-mm-dd,具体到天
datetimeyyyy-mm-dd hh:mm:ss具体到秒
timestamp时间戳
String类型
enumenum是一个字符串对象,其值来自表创建时在列规定中表现罗列的一个列值。
setset是一个字符串对象,可以有零或者多个值,其值来自表创建时规定的允许的一列值。指定包括多个set成员的set列值时各成员之间用逗号隔断开。这样的set成员值自己不能包含逗号。
数值类型


tinyint类型

tinyint 、smallint、int、bigint四个整数类型操作根本相同,差别之处只有存储的数据巨细差别。我们以tinyint为例举行解说
数值越界测试

对于有符号的整数tinyint
我们先创建一个tinyint类型的表,然后对其举行插入操作。观察越界情况。
  1. mysql> create table if not exists t1(//创建一个表
  2.     -> num tinyint
  3.     -> );
  4. Query OK, 0 rows affected (0.01 sec)
  5. mysql> insert into t1 values (-128);//进行插入操作
  6. Query OK, 1 row affected (0.00 sec)
  7. mysql> insert into t1 values (127);
  8. Query OK, 1 row affected (0.01 sec)
  9. mysql> insert into t1 values (0);
  10. Query OK, 1 row affected (0.01 sec)
  11. mysql> insert into t1 values (-18);
  12. Query OK, 1 row affected (0.02 sec)
  13. mysql> insert into t1 values (24);
  14. Query OK, 1 row affected (0.00 sec)
  15. mysql> select * from t1;//查看插入结果
  16. +------+
  17. | num  |
  18. +------+
  19. | -128 |
  20. |  127 |
  21. |    0 |
  22. |  -18 |
  23. |   24 |
  24. +------+
  25. 5 rows in set (0.00 sec)
复制代码
当我们创建了一个类型为tinyint类型的表时,发现插入的范围只能是-128~127,假如越界插入则会报错。
错误插入示例:
  1. mysql> insert into t1 values (-129);//越界插入
  2. ERROR 1264 (22003): Out of range value for column 'num' at row 1
  3. mysql> insert into t1 values (128);
  4. ERROR 1264 (22003): Out of range value for column 'num' at row 1
  5. mysql> insert into t1 values (243);
  6. ERROR 1264 (22003): Out of range value for column 'num' at row 1
  7. mysql> insert into t1 values (-548);
  8. ERROR 1264 (22003): Out of range value for column 'num' at row 1
  9. mysql> select * from t1;//越界插入的内容不会存到表里
  10. +------+
  11. | num  |
  12. +------+
  13. | -128 |
  14. |  127 |
  15. |    0 |
  16. |  -18 |
  17. |   24 |
  18. +------+
  19. 5 rows in set (0.00 sec)
复制代码
对于无符号的整数tinyint unsigned
  1. mysql> create table t2(
  2.     -> num tinyint unsigned
  3.     -> );
  4. Query OK, 0 rows affected (0.01 sec)
  5. mysql> insert into t2 values (0);
  6. Query OK, 1 row affected (0.01 sec)
  7. mysql> insert into t2 values (255);
  8. Query OK, 1 row affected (0.01 sec)
  9. mysql> insert into t2 values (128);
  10. Query OK, 1 row affected (0.01 sec)
  11. mysql> insert into t2 values (-1);
  12. ERROR 1264 (22003): Out of range value for column 'num' at row 1
  13. mysql> insert into t2 values (256);
  14. ERROR 1264 (22003): Out of range value for column 'num' at row 1
  15. mysql> insert into t2 values (-128);
  16. ERROR 1264 (22003): Out of range value for column 'num' at row 1
  17. mysql> select * from t2;
  18. +------+
  19. | num  |
  20. +------+
  21. |    0 |
  22. |  255 |
  23. |  128 |
  24. +------+
  25. 3 rows in set (0.00 sec)
复制代码
结果说明



  • 在MySQL中,整形可以指定是有符号的还是无符号的,默认是有符号的。
  • 可以通过unsigned来说明某个字段是无符号的。
  • 其他整数类型和tinyint的使用方法完全相同,差异只在存储数据的巨细上。
   假如我们向mysql特定的类型中插入不合法的数据,mysql一般是直接拦截我们,不让我们举行操作。反过来,假如我们的数据被乐成插入到mysql中了,则数据一定是合法的。
所以,mysql中,数据类型自己也是一种束缚。目的是倒逼程序员尽可能精确的插入,别的,假如不是一个很好的使用者的话,mysql也能保证数据的合法性。这使得数据库中的数据是可预期的,完备的。
  bit类型

根本语法

  1. bit[M] : 位字段类型,M表示每个值的位数,范围是1~64。如果被忽略,默认为1。
复制代码
使用

  1. mysql> create table t3(
  2.     -> id int,
  3.     -> online bit(1)
  4.     -> );
  5. Query OK, 0 rows affected (0.02 sec)
  6. mysql> desc t3;
  7. +--------+---------+------+-----+---------+-------+
  8. | Field  | Type    | Null | Key | Default | Extra |
  9. +--------+---------+------+-----+---------+-------+
  10. | id     | int(11) | YES  |     | NULL    |       |
  11. | online | bit(1)  | YES  |     | NULL    |       |
  12. +--------+---------+------+-----+---------+-------+
  13. 2 rows in set (0.01 sec)
  14. mysql> insert into t3 (id, online) values (123, 0);
  15. Query OK, 1 row affected (0.01 sec)
  16. mysql> insert into t3 (id, online) values (122, 1);
  17. Query OK, 1 row affected (0.00 sec)
  18. mysql> insert into t3 (id, online) values (122, 3);
  19. ERROR 1406 (22001): Data too long for column 'online' at row 1
  20. mysql> insert into t3 (id, online) values (122, -1);
  21. ERROR 1406 (22001): Data too long for column 'online' at row 1
  22. mysql> select * from t3;
  23. +------+--------+
  24. | id   | online |
  25. +------+--------+
  26. |  123 |        |
  27. |  122 |       |
  28. +------+--------+
  29. 2 rows in set (0.00 sec)
复制代码
注意事项


  • bit字段在在表现时,默认是按照ASCII码值来表现的,我们想表现的看,可以改成16进制
  1. mysql> select id, hex(online) from t3;
  2. +------+-------------+
  3. | id   | hex(online) |
  4. +------+-------------+
  5. |  123 | 0           |
  6. |  122 | 1           |
  7. +------+-------------+
  8. 2 rows in set (0.01 sec)
复制代码

  • 验证bit是按照ASCII码值来表现的
  1. mysql> alter table t3 change online online bit(10);
  2. Query OK, 2 rows affected (0.03 sec)
  3. Records: 2  Duplicates: 0  Warnings: 0
  4. mysql> insert into t3 (id, online) values (134, 'a');
  5. Query OK, 1 row affected (0.00 sec)
  6. mysql> insert into t3 (id, online) values (132, 97);
  7. Query OK, 1 row affected (0.02 sec)
  8. mysql> select * from t3;
  9. +------+--------+
  10. | id   | online |
  11. +------+--------+
  12. |  123 |        |
  13. |  122 |       |
  14. |  134 |  a     |
  15. |  132 |  a     |
  16. +------+--------+
  17. 4 rows in set (0.00 sec)
复制代码

  • 验证bit最多存放64位
  1. mysql> create table t4(
  2.     -> id int,
  3.     -> online bit(65)
  4.     -> );
  5. ERROR 1439 (42000): Display width out of range for column 'online' (max = 64)
  6. mysql> create table t4( id int, online bit(64) );
  7. Query OK, 0 rows affected (0.01 sec)
  8. mysql> desc t4;
  9. +--------+---------+------+-----+---------+-------+
  10. | Field  | Type    | Null | Key | Default | Extra |
  11. +--------+---------+------+-----+---------+-------+
  12. | id     | int(11) | YES  |     | NULL    |       |
  13. | online | bit(64) | YES  |     | NULL    |       |
  14. +--------+---------+------+-----+---------+-------+
  15. 2 rows in set (0.00 sec)
复制代码
小数类型

float

语法

  1. float[(m,d)] [unsigned] : m指定显示长度,d指定小数位数,占用空间四个字节
复制代码
使用

float(4,2)表示的范围是-99.99~99.99。mysql在保存float的值的时间会举行四舍五入。
  1. mysql> create table t5(
  2.     -> id int,
  3.     -> salary float(4,2)
  4.     -> );
  5. Query OK, 0 rows affected (0.01 sec)
  6. mysql> desc t5;
  7. +--------+------------+------+-----+---------+-------+
  8. | Field  | Type       | Null | Key | Default | Extra |
  9. +--------+------------+------+-----+---------+-------+
  10. | id     | int(11)    | YES  |     | NULL    |       |
  11. | salary | float(4,2) | YES  |     | NULL    |       |
  12. +--------+------------+------+-----+---------+-------+
  13. 2 rows in set (0.00 sec)
  14. mysql> insert into t5 values(1, 99.99);
  15. Query OK, 1 row affected (0.01 sec)
  16. mysql> insert into t5 values(2, -99.99);
  17. Query OK, 1 row affected (0.01 sec)
  18. mysql> insert into t5 values(2, -12.34);
  19. Query OK, 1 row affected (0.01 sec)
  20. mysql> insert into t5 values(2, 43.21);
  21. Query OK, 1 row affected (0.00 sec)
  22. mysql> insert into t5 values(2, 99.995);
  23. ERROR 1264 (22003): Out of range value for column 'salary' at row 1
  24. mysql> insert into t5 values(2, 99.994);
  25. Query OK, 1 row affected (0.00 sec)
  26. mysql> insert into t5 values(2, -99.994);
  27. Query OK, 1 row affected (0.01 sec)
  28. mysql> insert into t5 values(2, -99.996);
  29. ERROR 1264 (22003): Out of range value for column 'salary' at row 1
  30. mysql> select * from t5;
  31. +------+--------+
  32. | id   | salary |
  33. +------+--------+
  34. |    1 |  99.99 |
  35. |    2 | -99.99 |
  36. |    2 | -12.34 |
  37. |    2 |  43.21 |
  38. |    2 |  99.99 |
  39. |    2 | -99.99 |
  40. +------+--------+
  41. 6 rows in set (0.00 sec)
复制代码
float(4,2) unsigned表示的范围是0~99.99。
  1. mysql> create table t6(
  2.     -> id bigint,
  3.     -> salary float(4,2) unsigned
  4.     -> );
  5. Query OK, 0 rows affected (0.01 sec)
  6. mysql> desc t6;
  7. +--------+---------------------+------+-----+---------+-------+
  8. | Field  | Type                | Null | Key | Default | Extra |
  9. +--------+---------------------+------+-----+---------+-------+
  10. | id     | bigint(20)          | YES  |     | NULL    |       |
  11. | salary | float(4,2) unsigned | YES  |     | NULL    |       |
  12. +--------+---------------------+------+-----+---------+-------+
  13. 2 rows in set (0.00 sec)
  14. mysql> insert into t6 values(1,99.99);
  15. Query OK, 1 row affected (0.00 sec)
  16. mysql> insert into t6 values(1, 0);
  17. Query OK, 1 row affected (0.00 sec)
  18. mysql> insert into t6 values(1, -99.99);
  19. ERROR 1264 (22003): Out of range value for column 'salary' at row 1
  20. mysql> insert into t6 values(1, -0.99);
  21. ERROR 1264 (22003): Out of range value for column 'salary' at row 1
  22. mysql> insert into t6 values(1, 99.996);
  23. ERROR 1264 (22003): Out of range value for column 'salary' at row 1
  24. mysql> insert into t6 values(1, 99.994);
  25. Query OK, 1 row affected (0.00 sec)
  26. mysql> select * from t6;
  27. +------+--------+
  28. | id   | salary |
  29. +------+--------+
  30. |    1 |  99.99 |
  31. |    1 |   0.00 |
  32. |    1 |  99.99 |
  33. +------+--------+
  34. 3 rows in set (0.00 sec)
复制代码
注意事项


  • float的默认精度,默认是6位有效数字
  1. mysql> alter table t5 modify salary float;
  2. Query OK, 0 rows affected (0.01 sec)
  3. Records: 0  Duplicates: 0  Warnings: 0
  4. mysql> desc t5;
  5. +--------+---------+------+-----+---------+-------+
  6. | Field  | Type    | Null | Key | Default | Extra |
  7. +--------+---------+------+-----+---------+-------+
  8. | id     | int(11) | YES  |     | NULL    |       |
  9. | salary | float   | YES  |     | NULL    |       |
  10. +--------+---------+------+-----+---------+-------+
  11. 2 rows in set (0.00 sec)
  12. mysql> insert into t5 values(1, 2435324524.143143123412);
  13. Query OK, 1 row affected (0.01 sec)
  14. mysql> insert into t5 values(1, 0.143143123412);
  15. Query OK, 1 row affected (0.01 sec)
  16. mysql> insert into t5 values(1, 3456889470980.14314);
  17. Query OK, 1 row affected (0.00 sec)
  18. mysql> select * from t5;
  19. +------+---------------+
  20. | id   | salary        |
  21. +------+---------------+
  22. |    1 |         99.99 |
  23. |    2 |        -99.99 |
  24. |    2 |        -12.34 |
  25. |    2 |         43.21 |
  26. |    2 |         99.99 |
  27. |    2 |        -99.99 |
  28. |    1 |    2435320000 |
  29. |    1 |      0.143143 |
  30. |    1 | 3456890000000 |
  31. +------+---------------+
  32. 9 rows in set (0.00 sec)
复制代码
decimal

语法

  1. decimal(m,d) [unsigned] : 定点m指定长度,d表示小数点的位数
复制代码
使用

decimal类型在使用时几乎和float类型相同,同样在保存数据的时间,会举行四舍五入。
  1. mysql> create table t7(
  2.     -> id int,
  3.     -> salary decimal(4,2)
  4.     -> );
  5. Query OK, 0 rows affected (0.01 sec)
  6. mysql> desc t7;
  7. +--------+--------------+------+-----+---------+-------+
  8. | Field  | Type         | Null | Key | Default | Extra |
  9. +--------+--------------+------+-----+---------+-------+
  10. | id     | int(11)      | YES  |     | NULL    |       |
  11. | salary | decimal(4,2) | YES  |     | NULL    |       |
  12. +--------+--------------+------+-----+---------+-------+
  13. 2 rows in set (0.00 sec)
  14. mysql> insert into t7 values(1,99.99);
  15. Query OK, 1 row affected (0.00 sec)
  16. mysql> insert into t7 values(1,-99.99);
  17. Query OK, 1 row affected (0.01 sec)
  18. mysql> insert into t7 values(1,0);
  19. Query OK, 1 row affected (0.01 sec)
  20. mysql> insert into t7 values(1,99.994);
  21. Query OK, 1 row affected, 1 warning (0.01 sec)
  22. mysql> insert into t7 values(1,99.996);
  23. ERROR 1264 (22003): Out of range value for column 'salary' at row 1
  24. mysql> insert into t7 values(1,-99.996);
  25. ERROR 1264 (22003): Out of range value for column 'salary' at row 1
  26. mysql> insert into t7 values(1,-99.994);
  27. Query OK, 1 row affected, 1 warning (0.00 sec)
  28. mysql> select * from t7;
  29. +------+--------+
  30. | id   | salary |
  31. +------+--------+
  32. |    1 |  99.99 |
  33. |    1 | -99.99 |
  34. |    1 |   0.00 |
  35. |    1 |  99.99 |
  36. |    1 | -99.99 |
  37. +------+--------+
  38. 5 rows in set (0.00 sec)
复制代码
float 和decimal的比力

float和decimal在使用的时间几乎相同,但是在保存的数据小数点后的数比力多的时间,float会有精度的损失,decimal没有精度损失,更加准确。
  1. mysql> drop table t7;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> create table if not exists t7(
  4.     -> f1 float(10,8),
  5.     -> f2 decimal(10,8)
  6.     -> );
  7. Query OK, 0 rows affected (0.01 sec)
  8. mysql> desc t7;
  9. +-------+---------------+------+-----+---------+-------+
  10. | Field | Type          | Null | Key | Default | Extra |
  11. +-------+---------------+------+-----+---------+-------+
  12. | f1    | float(10,8)   | YES  |     | NULL    |       |
  13. | f2    | decimal(10,8) | YES  |     | NULL    |       |
  14. +-------+---------------+------+-----+---------+-------+
  15. 2 rows in set (0.00 sec)
  16. mysql> insert into t7 values(23.12345612, 23.12345612);
  17. Query OK, 1 row affected (0.00 sec)
  18. mysql> select * from t7;
  19. +-------------+-------------+
  20. | f1          | f2          |
  21. +-------------+-------------+
  22. | 23.12345695 | 23.12345612 |
  23. +-------------+-------------+
  24. 1 row in set (0.00 sec)
复制代码
  float 的默认精度是7位,decimal整数最大位数m为65。支持小数最大位数d是30。假如d被省略,默以为0.假如m被省略,默认是10。
但是这些结论并不一定准确,mysql的版本差别,结果可能会差别。
  结论:
假如必要高精度的数据的话,推荐使用decimal。
字符串类型

char

语法

  1. char(L): 固定长度字符串,L是可以存储的长度,单位是字符,最大长度值可以是255。
复制代码
使用

  1. mysql> create table if not exists t8(
  2.     -> id int,
  3.     -> name char(2)
  4.     -> );
  5. Query OK, 0 rows affected (0.02 sec)
  6. mysql> desc t8;
  7. +-------+---------+------+-----+---------+-------+
  8. | Field | Type    | Null | Key | Default | Extra |
  9. +-------+---------+------+-----+---------+-------+
  10. | id    | int(11) | YES  |     | NULL    |       |
  11. | name  | char(2) | YES  |     | NULL    |       |
  12. +-------+---------+------+-----+---------+-------+
  13. 2 rows in set (0.00 sec)
  14. mysql> insert into t8 values (1,'a');
  15. Query OK, 1 row affected (0.01 sec)
  16. mysql> insert into t8 values (2,'ab');
  17. Query OK, 1 row affected (0.01 sec)
  18. mysql> insert into t8 values (3,'abc');
  19. ERROR 1406 (22001): Data too long for column 'name' at row 1
  20. mysql> insert into t8 values (3,'中');
  21. Query OK, 1 row affected (0.00 sec)
  22. mysql> insert into t8 values (3,'中国');
  23. Query OK, 1 row affected (0.01 sec)
  24. mysql> insert into t8 values (3,'中国人');
  25. ERROR 1406 (22001): Data too long for column 'name' at row 1
  26. mysql> select * from t8;
  27. +------+--------+
  28. | id   | name   |
  29. +------+--------+
  30. |    1 | a      |
  31. |    2 | ab     |
  32. |    3 | 中     |
  33. |    3 | 中国   |
  34. +------+--------+
  35. 4 rows in set (0.00 sec)
复制代码
注意事项


  • char(2)表示存放两个字符,可以是字母或者汉字,但是不能高出两个,
  • 最多只能是255。
  1. mysql> create table if not exists t9(
  2.     ->id int,
  3.     ->name char(256)
  4.     ->);
  5. ERROR 1074 (42000): Column length too big for column 'name' (max = 255); use BLOB or TEXT instead
复制代码
varchar

语法

  1. vatchar(L),可变长度字符串,L表示字符长度,最大长度65535个字节。
复制代码
是65535个字节,不是65535个字符。
使用

  1. mysql> create table if not exists t9(
  2.     -> id int,
  3.     -> name varchar(6)
  4.     -> );
  5. Query OK, 0 rows affected (0.01 sec)
  6. mysql> desc t9;
  7. +-------+------------+------+-----+---------+-------+
  8. | Field | Type       | Null | Key | Default | Extra |
  9. +-------+------------+------+-----+---------+-------+
  10. | id    | int(11)    | YES  |     | NULL    |       |
  11. | name  | varchar(6) | YES  |     | NULL    |       |
  12. +-------+------------+------+-----+---------+-------+
  13. 2 rows in set (0.00 sec)
  14. mysql> insert into t9 values (1,'hello');
  15. Query OK, 1 row affected (0.00 sec)
  16. mysql> insert into t9 values (2,'我爱你,中国');
  17. Query OK, 1 row affected (0.01 sec)
  18. mysql> insert into t9 values (2,'我爱你,中国!');
  19. ERROR 1406 (22001): Data too long for column 'name' at row 1
  20. mysql> select * from t9;
  21. +------+--------------------+
  22. | id   | name               |
  23. +------+--------------------+
  24. |    1 | hello              |
  25. |    2 | 我爱你,中国       |
  26. +------+--------------------+
  27. 2 rows in set (0.00 sec)
复制代码
注意事项

关于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字节)。
  • 假如在表中另有其他数据,varchar能存储的最大值还可能会因此减少。
  1. mysql> create table t10(
  2.     -> name varchar(21845)
  3.     -> );
  4. ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
  5. mysql> create table t10( name varchar(21844) );
  6. Query OK, 0 rows affected (0.02 sec)
  7. mysql> alter table t9 modify name varchar(21845)
  8.     -> ;
  9. ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
  10. mysql> alter table t9 modify name varchar(21844);
  11. ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
  12. mysql> alter table t9 modify name varchar(21842);
  13. Query OK, 2 rows affected (0.03 sec)
  14. Records: 2  Duplicates: 0  Warnings: 0
复制代码
char 和varchar 的比力和选择


如何选择定长或变长字符串?


  • 假如数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
  • 假如数据长度有变化,就使用变长(varchar), 比如:名字,地点,但是你要保证
  • 最长的能存的进去。定长的磁盘空间比力浪费,但是效率高。
  • 变长的磁盘空间比力节流,但是效率低。
  • 定长的意义是,直接开发好对应的空间
  • 变长的意义是,在不高出自界说范围的情况下,用多少,开发多少。
日期类型

类型

常用的类型有三个


  • date : 日期格式 'yyyy-mm-dd',占用3个字节。
  • datetime : 日期时间格式'yyyy-mm-dd hh:ii:ss'占用8个字节。
  • timestamp : 时间戳,从1970年一月一号零时开始的。'yyyy-mm-dd hh:ii:ss'格式完全和datetime一致,占用四个字节。
当我们对数据举行增长或者更改的时间, timestamp自动更新为当前的时间。不必要我们手动填写。
使用

  1. mysql> create table if not exists t11(
  2.     -> t1 date,
  3.     -> t2 datetime,
  4.     -> t3 timestamp
  5.     -> );
  6. Query OK, 0 rows affected (0.02 sec)
  7. mysql> desc t11;
  8. +-------+-----------+------+-----+-------------------+-----------------------------+
  9. | Field | Type      | Null | Key | Default           | Extra                       |
  10. +-------+-----------+------+-----+-------------------+-----------------------------+
  11. | t1    | date      | YES  |     | NULL              |                             |
  12. | t2    | datetime  | YES  |     | NULL              |                             |
  13. | t3    | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
  14. +-------+-----------+------+-----+-------------------+-----------------------------+
  15. 3 rows in set (0.00 sec)
  16. mysql> insert into t11 (t1,t2) values ('2000-10-01', '1949-10-01 08:00:00');
  17. Query OK, 1 row affected (0.00 sec)
  18. mysql> select * from t11;
  19. +------------+---------------------+---------------------+
  20. | t1         | t2                  | t3                  |
  21. +------------+---------------------+---------------------+
  22. | 2000-10-01 | 1949-10-01 08:00:00 | 2025-01-25 23:03:03 |
  23. +------------+---------------------+---------------------+
  24. 1 row in set (0.00 sec)
  25. mysql> update t11 set t1='1999-01-01';
  26. Query OK, 1 row affected (0.01 sec)
  27. Rows matched: 1  Changed: 1  Warnings: 0
  28. mysql> select * from t11;
  29. +------------+---------------------+---------------------+
  30. | t1         | t2                  | t3                  |
  31. +------------+---------------------+---------------------+
  32. | 1999-01-01 | 1949-10-01 08:00:00 | 2025-01-25 23:05:03 |
  33. +------------+---------------------+---------------------+
  34. 1 row in set (0.00 sec)
复制代码
enum和set

语法



  • enum:罗列,“单选”类型;
    enum('选项1','选项2','选项3',...);
    该设定只是提供了若干个选项的值,最终一个单位格中,实际只存储了其中一个值;而且出于效率思量,这些值实际存储的是“数字”,由于这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535 个;当我们添加罗列值时,也可以添加对应的数字下标
  • set:集合,“多选”类型;
    set('选项值1','选项值2','选项值3', ...);
    该设定只是提供了若干个选项的值,最终一个单位格中,计划可存储了其中任意多个值;而且出于效率思量,这些值实际存储的是“数字”,由于这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,…最多64个
  • 说明:不建议在添加罗列值,集合值的时间采用数字的方式,由于倒霉于阅读。
使用

  1. mysql> create table votes(
  2.     -> username varchar(30),
  3.     -> gender enum('男','女'),
  4.     -> hobby set('代码','羽毛球','乒乓球','足球','游泳')
  5.     -> );
  6. Query OK, 0 rows affected (0.01 sec)
  7. mysql> desc votes;
  8. +----------+---------------------------------------------------------+------+-----+---------+-------+
  9. | Field    | Type                                                    | Null | Key | Default | Extra |
  10. +----------+---------------------------------------------------------+------+-----+---------+-------+
  11. | username | varchar(30)                                             | YES  |     | NULL    |       |
  12. | gender   | enum('男','女')                                         | YES  |     | NULL    |       |
  13. | hobby    | set('代码','羽毛球','乒乓球','足球','游泳')             | YES  |     | NULL    |       |
  14. +----------+---------------------------------------------------------+------+-----+---------+-------+
  15. 3 rows in set (0.00 sec)
  16. mysql> insert into votes values('张三','男','代码');
  17. Query OK, 1 row affected (0.00 sec)
  18. mysql> insert into votes values('李四','女','乒乓球');
  19. Query OK, 1 row affected (0.01 sec)
  20. mysql> insert into votes values('李四','unknown','乒乓球');
  21. ERROR 1265 (01000): Data truncated for column 'gender' at row 1
  22. mysql> select * from votes;
  23. +----------+--------+-----------+
  24. | username | gender | hobby     |
  25. +----------+--------+-----------+
  26. | 张三     | 男     | 代码      |
  27. | 李四     | 女     | 乒乓球    |
  28. +----------+--------+-----------+
  29. 2 rows in set (0.00 sec)
复制代码
注意事项


  • enum 使用的是下标
  1. mysql> insert into votes values('王五','1','羽毛球');
  2. Query OK, 1 row affected (0.01 sec)
  3. mysql> insert into votes values('赵六','2','羽毛球');
  4. Query OK, 1 row affected (0.01 sec)
  5. mysql> select * from votes;
  6. +----------+--------+-----------+
  7. | username | gender | hobby     |
  8. +----------+--------+-----------+
  9. | 张三     | 男     | 代码      |
  10. | 李四     | 女     | 乒乓球    |
  11. | 王五     | 男     | 羽毛球    |
  12. | 赵六     | 女     | 羽毛球    |
  13. +----------+--------+-----------+
  14. 4 rows in set (0.00 sec)
复制代码

  • set 使用的是位图
  1. mysql> insert into votes values('赵六',1,1);
  2. Query OK, 1 row affected (0.01 sec)
  3. mysql> insert into votes values('赵六',1,2);
  4. Query OK, 1 row affected (0.01 sec)
  5. mysql> insert into votes values('赵六',1,3);
  6. Query OK, 1 row affected (0.00 sec)
  7. mysql> select * from votes;
  8. +----------+--------+-----------------------------------+
  9. | username | gender | hobby                             |
  10. +----------+--------+-----------------------------------+
  11. | 张三     | 男     | 代码                              |
  12. | 李四     | 女     | 乒乓球                            |
  13. | 王五     | 男     | 羽毛球                            |
  14. | 赵六     | 女     | 羽毛球                            |
  15. | 赵六     | 男     | 代码,羽毛球,乒乓球,游泳           |
  16. | 赵六     | 男     | 代码,羽毛球,乒乓球                |
  17. | 赵六     | 男     | 羽毛球,乒乓球,游泳                |
  18. | 赵六     | NULL   | NULL                              |
  19. | 赵六     | 男     |                                   |
  20. | 赵六     | 男     | 代码                              |
  21. | 赵六     | 男     | 羽毛球                            |
  22. | 赵六     | 男     | 代码,羽毛球                       |
  23. +----------+--------+-----------------------------------+
  24. 12 rows in set (0.00 sec)
复制代码

  • NULL和''并不一样,NULL表示没有数据,''表示有数据,只不外数据是空。
  1. mysql> insert into votes (username) values('赵六');
  2. Query OK, 1 row affected (0.00 sec)
  3. mysql> insert into votes values('赵六',1,'');
  4. Query OK, 1 row affected (0.00 sec)
  5. mysql> select * from votes;
  6. +----------+--------+-----------------------------------+
  7. | username | gender | hobby                             |
  8. +----------+--------+-----------------------------------+
  9. | 张三     | 男     | 代码                              |
  10. | 李四     | 女     | 乒乓球                            |
  11. | 王五     | 男     | 羽毛球                            |
  12. | 赵六     | 女     | 羽毛球                            |
  13. | 赵六     | 男     | 代码,羽毛球,乒乓球,游泳           |
  14. | 赵六     | 男     | 代码,羽毛球,乒乓球                |
  15. | 赵六     | 男     | 羽毛球,乒乓球,游泳                |
  16. | 赵六     | NULL   | NULL                              |
  17. | 赵六     | 男     |                                   |
  18. +----------+--------+-----------------------------------+
  19. 9 rows in set (0.00 sec)
复制代码
类型查找

enum查找

既可以使用内容,也可以使用下标
  1. mysql> select * from votes where gender='女';
  2. +----------+--------+-----------+
  3. | username | gender | hobby     |
  4. +----------+--------+-----------+
  5. | 李四     | 女     | 乒乓球    |
  6. | 赵六     | 女     | 羽毛球    |
  7. +----------+--------+-----------+
  8. 2 rows in set (0.00 sec)
  9. mysql> select * from votes where gender=2;
  10. +----------+--------+-----------+
  11. | username | gender | hobby     |
  12. +----------+--------+-----------+
  13. | 李四     | 女     | 乒乓球    |
  14. | 赵六     | 女     | 羽毛球    |
  15. +----------+--------+-----------+
  16. 2 rows in set (0.00 sec)
复制代码
set查找

严格筛选

  1. mysql> select * from votes where hobby='羽毛球';
  2. +----------+--------+-----------+
  3. | username | gender | hobby     |
  4. +----------+--------+-----------+
  5. | 王五     | 男     | 羽毛球    |
  6. | 赵六     | 女     | 羽毛球    |
  7. | 赵六     | 男     | 羽毛球    |
  8. +----------+--------+-----------+
  9. 3 rows in set (0.00 sec)
  10. mysql> select * from votes where hobby=3;
  11. +----------+--------+------------------+
  12. | username | gender | hobby            |
  13. +----------+--------+------------------+
  14. | 赵六     | 男     | 代码,羽毛球      |
  15. +----------+--------+------------------+
  16. 1 row in set (0.00 sec)
复制代码
函数筛选

集合查询使用find_in_set函数:
find_in_set(sub, str_list):假如 sub 在 str_list 中,则返回下标;假如不在,返回0;str_list是用逗号分割的字符串。
  1. mysql> select * from votes where find_in_set('羽毛球',hobby);
  2. +----------+--------+-----------------------------------+
  3. | username | gender | hobby                             |
  4. +----------+--------+-----------------------------------+
  5. | 王五     | 男     | 羽毛球                            |
  6. | 赵六     | 女     | 羽毛球                            |
  7. | 赵六     | 男     | 代码,羽毛球,乒乓球,游泳           |
  8. | 赵六     | 男     | 代码,羽毛球,乒乓球                |
  9. | 赵六     | 男     | 羽毛球,乒乓球,游泳                |
  10. | 赵六     | 男     | 羽毛球                            |
  11. | 赵六     | 男     | 代码,羽毛球                       |
  12. +----------+--------+-----------------------------------+
  13. 7 rows in set (0.00 sec)
  14. mysql> select * from votes where find_in_set('羽毛球',hobby) and find_in_set('代码',hobby);
  15. +----------+--------+-----------------------------------+
  16. | username | gender | hobby                             |
  17. +----------+--------+-----------------------------------+
  18. | 赵六     | 男     | 代码,羽毛球,乒乓球,游泳           |
  19. | 赵六     | 男     | 代码,羽毛球,乒乓球                |
  20. | 赵六     | 男     | 代码,羽毛球                       |
  21. +----------+--------+-----------------------------------+
  22. 3 rows in set (0.00 sec)
复制代码
  ⚠️ 写在末了:以上内容是我在学习以后得一些总结和概括,如有错误或者必要增补的地方欢迎各位大佬评论或者私信我交流!!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表