表的创建语法

  1. create table 表(
  2. id int,
  3. name varchar(16)
  4. )default charset=utf8;

数字类型

  • int

int[(m)][unsigned][zerofill]

  1. int 表示有符号,取值范围:-2147483648 2147483647
  2. int unsigned 表示无符号,取值范围:0 4294967295
  3. int(5)zerofill 仅用于显示,当不满足5位时,按照左边补0,例如:00002;满足时,正常显示。
  1. mysql> create table L1(id int, uid int unsigned, zid int(5) zerofill) default charset=utf8;
  2. Query OK, 0 rows affected (0.03 sec)
  3. mysql> insert into L1(id,uid,zid) values(1,2,3);
  4. Query OK, 1 row affected (0.00 sec)
  5. mysql> insert into L1(id,uid,zid) values(2147483641,4294967294,300000);
  6. Query OK, 1 row affected (0.00 sec)
  7. mysql> select * from L1;
  8. +------------+------------+--------+
  9. | id | uid | zid |
  10. +------------+------------+--------+
  11. | 1 | 2 | 00003 |
  12. | 2147483641 | 4294967294 | 300000 |
  13. +------------+------------+--------+
  14. 2 rows in set (0.00 sec)
  15. mysql> insert into L1(id,uid,zid) values(214748364100,4294967294,300000);
  16. ERROR 1264 (22003): Out of range value for column 'id' at row 1
  17. mysql>
  • tinyint

tinyint[(m)] [unsigned] [zerofill]

  1. 有符号,取值范围:-128 127.
  2. 无符号,取值范围:0 255
  • bigint

bigint[(m)][unsigned][zerofill]

  1. 有符号,取值范围:-9223372036854775808 9223372036854775807
  2. 无符号,取值范围:0 18446744073709551615
  • decimal

decimal[(m[,d])] [unsigned] [zerofill]

  1. 准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65d最大值为30
  2. 例如:
  3. create table L2(
  4. id int not null primary key auto_increment,
  5. salary decimal(8,2)
  6. )default charset=utf8;
  1. mysql> create table L2(id int not null primary key auto_increment,salary decimal(8,2))default charset=utf8;
  2. Query OK, 0 rows affected (0.03 sec)
  3. mysql> insert into L2(salary) values(1.28);
  4. Query OK, 1 row affected (0.01 sec)
  5. mysql> insert into L2(salary) values(5.289);
  6. Query OK, 1 row affected, 1 warning (0.00 sec)
  7. mysql> insert into L2(salary) values(5.282);
  8. Query OK, 1 row affected, 1 warning (0.00 sec)
  9. mysql> insert into L2(salary) values(512132.28);
  10. Query OK, 1 row affected (0.00 sec)
  11. mysql> insert into L2(salary) values(512132.283);
  12. Query OK, 1 row affected, 1 warning (0.00 sec)
  13. mysql> select * from L2;
  14. +----+-----------+
  15. | id | salary |
  16. +----+-----------+
  17. | 1 | 1.28 |
  18. | 2 | 5.29 |
  19. | 3 | 5.28 |
  20. | 4 | 512132.28 |
  21. | 5 | 512132.28 |
  22. +----+-----------+
  23. 5 rows in set (0.00 sec)
  24. mysql> insert into L2(salary) values(5121321.283);
  25. ERROR 1264 (22003): Out of range value for column 'salary' at row 1
  • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

    1. 单精度浮点数,非准确小数值,m是数字总个数,d是小数点后个数。
  • DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

    1. 双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。

    DOUBLE和FLOAT不精准,一般使用decimal

    字符串类型

  • [x] char(m)

空间换时间

  1. 定长字符串,m代表字符串的长度,最多可容纳255个字符。
  2. 定长的体现:即使内容长度小于m,也会占用m长度。例如:char(5),数据是:yes,底层也会占用5个字符;如果超出m长度限制(默认MySQL是严格模式,所以会报错)。
  3. 如果在配置文件中加入如下配置,
  4. sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
  5. 保存并重启,此时MySQL则是非严格模式,此时超过长度则自动截断(不报错)。。
  6. 注意:默认底层存储是固定的长度(不够则用空格补齐),但是查询数据时,会自动将空白去除。 如果想要保留空白,在sql-mode中加入 PAD_CHAR_TO_FULL_LENGTH 即可。
  7. 查看模式sql-mode,执行命令:show variables like 'sql_mode';
  8. 一般适用于:固定长度的内容。
  9. create table L3(
  10. id int not null primary key auto_increment,
  11. name varchar(5),
  12. depart char(3)
  13. )default charset=utf8;
  14. insert into L3(name,depart) values("mf","mf2");
  • varchar(m)

时间换空间

  1. 变长字符串,m代表字符串的长度,最多可容纳65535个字节。
  2. 变长的体现:内容小于m时,会按照真实数据长度存储;如果超出m长度限制((默认MySQL是严格模式,所以会报错)。
  3. 如果在配置文件中加入如下配置,
  4. sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
  5. 保存并重启,此时MySQL则是非严格模式,此时超过长度则自动截断(不报错)。
  6. 例如:
  7. create table L3(
  8. id int not null primary key auto_increment,
  9. name varchar(5),
  10. depart char(3)
  11. )default charset=utf8;
  • text
    ``` text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 − 1)个字符。

一般情况下,长文本会用text类型。例如:文章、新闻等。

  1. ```sql
  2. create table L4(
  3. id int not null primary key auto_increment,
  4. title varchar(128),
  5. content text
  6. )default charset=utf8;
  • mediumtext

    1. A TEXT column with a maximum length of 16,777,215 (2**24 1) characters.
  • longtext

    1. A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 1)

    mediumtextlongtext 不常用,大文本用text类型。

    时间类型

  • [x] datetime

    1. YYYY-MM-DD HH:MM:SS1000-01-01 00:00:00/9999-12-31 23:59:59
  • [x] timestamp

    1. YYYY-MM-DD HH:MM:SS1970-01-01 00:00:00/2037年)

    ```plsql 对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储,查询时,将其又转化为客户端当前时区进行返回。

对于DATETIME,不做任何改变,原样输入和输出。

  1. ```plsql
  2. mysql> create table L5(
  3. -> id int not null primary key auto_increment,
  4. -> dt datetime,
  5. -> tt timestamp
  6. -> )default charset=utf8;
  7. Query OK, 0 rows affected (0.03 sec)
  8. mysql> insert into L5(dt,tt) values("2025-11-11 11:11:44", "2025-11-11 11:11:44");
  9. mysql> select * from L5;
  10. +----+---------------------+---------------------+
  11. | id | dt | tt |
  12. +----+---------------------+---------------------+
  13. | 1 | 2025-11-11 11:11:44 | 2025-11-11 11:11:44 |
  14. +----+---------------------+---------------------+
  15. 1 row in set (0.00 sec)
  16. mysql> show variables like '%time_zone%';
  17. +------------------+--------+
  18. | Variable_name | Value |
  19. +------------------+--------+
  20. | system_time_zone | CST |
  21. | time_zone | SYSTEM |
  22. +------------------+--------+
  23. 2 rows in set (0.00 sec)
  24. -- “CST”指的是MySQL所在主机的系统时间,是中国标准时间的缩写,China Standard Time UT+8:00
  25. mysql> set time_zone='+0:00';
  26. Query OK, 0 rows affected (0.00 sec)
  27. mysql> show variables like '%time_zone%';
  28. +------------------+--------+
  29. | Variable_name | Value |
  30. +------------------+--------+
  31. | system_time_zone | CST |
  32. | time_zone | +00:00 |
  33. +------------------+--------+
  34. 2 rows in set (0.01 sec)
  35. mysql> select * from L5;
  36. +----+---------------------+---------------------+
  37. | id | dt | tt |
  38. +----+---------------------+---------------------+
  39. | 1 | 2025-11-11 11:11:44 | 2025-11-11 03:11:44 |
  40. +----+---------------------+---------------------+
  41. 1 row in set (0.00 sec)
  • [x] date

    1. YYYY-MM-DD1000-01-01/9999-12-31
  • [x] time

    1. HH:MM:SS'-838:59:59'/'838:59:59'

MySQL还有很多其他的数据类型,例如:set、enum、TinyBlob、Blob、MediumBlob、LongBlob 等,详细见官方文档:https://dev.mysql.com/doc/refman/5.7/en/data-types.html