show variables like'sql_mode';
select @@sql_mode;
set session sql_mode= 'STRICT_TRANS_TABLES';
[mysqld]
# 修改严格模式
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
CHAR
和 VARCHAR
)的大小,指定存储的字符个数或字节数。CHAR
类型是一种固定长度的字符串类型。当你定义 CHAR
类型时,需要指定宽度,该宽度表示存储的字符个数。CHAR(10)
表示存储固定长度为10的字符串。VARCHAR
类型是一种可变长度的字符串类型。当你定义 VARCHAR
类型时,需要指定最大宽度,该宽度表示存储的字符个数的最大值。VARCHAR(255)
表示最大存储长度为255的可变长度字符串。CHAR
和 VARCHAR
,但是用于存储二进制数据。指定宽度时表示存储的字节数。BINARY(10)
表示存储固定长度为10字节的二进制数据。INT
、DECIMAL
),宽度通常表示显示的宽度,即在查询结果中显示的位数。这不影响存储大小或范围。DECIMAL(8,2)
表示总共8位,其中有2位是小数部分。整数类型 | 字节 | 无符号数的取值范围 | 有符号数的取值范围(默认) |
---|---|---|---|
TINYINT |
1 | 0~255 | -128~127 |
SMALLINT |
2 | 0~65535 | -32768~32767 |
MEDIUMINT |
3 | 0~16777215 | -8388608~8388607 |
INT |
4 | 0~4294967295 | -2147483648~2147483647 |
BIGINT |
8 | 0~18446744073709551615 | -9223372036854774808~9223372036854774807 |
mysql> create table t1 (id1 tinyint); --建表
Query OK, 0 rows affected (0.03 sec)
mysql> insert t1 values(-128); --插入负数
Query OK, 1 row affected (0.01 sec)
mysql> insert t1 values(128); --插入超出范围的数字
ERROR 1264 (22003): Out of range value for column 'id1' at row 1
mysql> alter table t1 add id2 tinyint unsigned; --添加无符号
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert t1 values(1, 128); --128可以在无符号的范围里面
Query OK, 1 row affected (0.01 sec)
mysql> alter table t1 modify id1 int(8); --修改类型并限制显示8位数
Query OK, 2 rows affected (0.07 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert t1 values(1), (123456789); --添加一个1位数和一个8位数
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from t1; --查看结果
+-----------+
| id1 |
+-----------+
| -128 |
| 1 |
| 1 |
| 123456789 |
+-----------+
4 rows in set (0.00 sec)
mysql> delete from t1 where id=-128; -- 先把负数删除
Query OK, 1 row affected (0.01 sec)
mysql> alter table t1 modify column id int(8) zerofill; --添加约束条件
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from t1; --查看结果
+-----------+
| id |
+-----------+
| 00000001 |
| 00000001 |
| 123456789 |
+-----------+
3 rows in set (0.00 sec)
mysql> insert t1 values(-128); --尝试添加负数
ERROR 1264 (22003): Out of range value for column 'id' at row 1
左侧填充指定字符到指定位数查看
由于填充的可以是字符,所以原数据类型不会影响,可以为负数等
超出范围的内容将省略,从右开始往左省
语法
select lpad(字段名, 显示长度, '填充字符') from 表名;
mysql> select lpad(id, 10, 'x') from t1;
+-------------------+
| lpad(id, 10, 'x') |
+-------------------+
| xx00000001 |
| xx00000001 |
| x123456789 |
+-------------------+
3 rows in set (0.03 sec)
数据类型 | 字节数 | 取值范围 |
---|---|---|
FLOAT | 4 | -2^128到2 ^128 即-3.40E+38到3.40E+38 |
DOUBLE | 8 | -2^1024到 2^1024 即-1.79E+308到1.79E+308 |
DECIMAL 定点数 |
设置位数和精度。 | 65 ~ 30 总共65位数,小数部分不能超过30位 |
decimal
存储方式: 使用固定点表示法,即将数字分为整数部分和小数部分,每一部分用固定的位数表示。
精度: DECIMAL 提供高精度的十进制算术,不会有浮点数的精度损失。
范围: 虽然 DECIMAL 提供了高精度,但是在存储非常大或非常小的数值时,FLOAT 类型可能提供更大的范围。
float 和 double:
存储方式: 使用二进制浮点表示法,可以表示非常大或非常小的数值,但是在表示精确的小数时可能存在精度损失。
**精度:**是近似数值的存储方式,可能存在精度损失,尤其在需要高精度的计算时。
范围: 类型提供了更大的范围,但是在某些场景下,由于浮点数的特性,可能会导致精度问题。
create table t2(id1 float(8, 3); --创建表,浮点型最多8位,小数最多3位
insert t2 values(12345.789); --插入正常值,可以
insert t2 values(123456.78); --整数部分6位数,报错
ERROR 1264 (22003): Out of range value for column 'id1' at row 1
insert t2 values(12345.7899); --小数部分超出范围,没有报错
mysql> select * from t2; --查看结果
+-----------+
| id1 |
+-----------+
| 12345.789 |
| 12345.790 |
+-----------+
mysql> alter table t2 modify id1 float(65,30); --将原本的8,3该长位65,30
mysql> alter table t2 add id2 double(65, 30); --添加double(65,30)
mysql> alter table t2 add id3 decimal(65,30); --添加decimal(65,30)
mysql> insert t2 values (1.11111111111111111111,
-> 1.11111111111111111111,
-> 1.11111111111111111111);
mysql> select * from t2;
+--------------------------------------+----------------------------------+----------------------------------+
| id1 | id2 | id3 |
+--------------------------------------+----------------------------------+----------------------------------+
| 12345.789062500000000000000000000000 | NULL | NULL |
| 12345.790039062500000000000000000000 | NULL | NULL |
| 1.110999941825866700000000000000 | NULL | NULL |
| 1.111111164093017600000000000000 | 1.111111111111111200000000000000 | 1.111111111111111111110000000000 |
+--------------------------------------+----------------------------------+----------------------------------+
数据类型 | 字符数 | 含义 |
---|---|---|
char | 默认一个字符 | 定长,超出范围报错 不够自动空格补全 |
varchar | 必须指定字符数 | 变长,超出范围报错 不够,有几个存几个 |
mysql> create table t3(
-> name1 char, --可以不写字符个数,默认1
-> name2 char(4), --限制4个字符
-> name3 varchar(4) --必须填写一个数字
-> );
insert t3 values ('t', 'tom', 'tom'); --超出范围将会报错
mysql> select * from t3;
+-------+-------+-------+
| name1 | name2 | name3 |
+-------+-------+-------+
| t | tom | tom | --空格我们并不能看出来
+-------+-------+-------+
1 row in set (0.00 sec)
mysql> select char_length(name1), char_length(name2), char_length(name3) from t3;
+--------------------+--------------------+--------------------+
| char_length(name1) | char_length(name2) | char_length(name3) |
+--------------------+--------------------+--------------------+
| 1 | 3 | 3 |
+--------------------+--------------------+--------------------+
1 row in set (0.00 sec)
# 先查询
show variables like 'sql_mode';
# 在原有的基础上添加
set session sql_mode=concat(@@global.sql_mode, "PAD_CHAR_TO_FULL_LENGTH");
mysql> select char_length(name1), char_length(name2), char_length(name3) from t3;
+--------------------+--------------------+--------------------+
| char_length(name1) | char_length(name2) | char_length(name3) |
+--------------------+--------------------+--------------------+
| 1 | 4 | 3 |
+--------------------+--------------------+--------------------+
char:
varchar
目前更倾向于用varchar
数据类型 | 显示样式 |
---|---|
date | 年-月-日 |
time | 时:分:秒 |
datetime | 年-月-日 时:分:秒 |
year | 年,自动补充置四位 |
mysql> create table t4(
-> birth_date date,
-> birth_time time,
-> birth_datetime datetime,
-> birth_year year
-> );
mysql> desc t4;
+----------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+----------+------+-----+---------+-------+
| birth_date | date | YES | | NULL | |
| birth_time | time | YES | | NULL | |
| birth_datetime | datetime | YES | | NULL | |
| birth_year | year(4) | YES | | NULL | |
+----------------+----------+------+-----+---------+-------+
4 rows in set (0.01 sec)
insert t4 values ('2000-1-1', '12:00:00', '2000-5-10 5:6:20', '00'); --年份简写
insert t4 values ('2000-1-1', '12:00:00', '2000-5-10 5:6:20', '98'); --年份简写
mysql> select * from t4;
+------------+------------+---------------------+------------+
| birth_date | birth_time | birth_datetime | birth_year |
+------------+------------+---------------------+------------+
| 2000-01-01 | 12:00:00 | 2000-05-10 05:06:20 | 2000 |
| 2000-01-01 | 12:00:00 | 2000-05-10 05:06:20 | 1998 |
+------------+------------+---------------------+------------+
enum
和集合set
mysql> create table t5(
-> sex enum('female', 'male'), --性别枚举
-> color set('black', 'green', 'yellow') --颜色集合
-> );
mysql> desc t5;
+-------+-------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------------------------+------+-----+---------+-------+
| sex | enum('female','male') | YES | | NULL | |
| color | set('black','green','yellow') | YES | | NULL | |
+-------+-------------------------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> insert t5 values('female', 'black'), ('male', 'green, black'); --含有空格,导致报错
ERROR 1265 (01000): Data truncated for column 'color' at row 2
mysql> insert t5 values('female', 'black'), ('male', 'green,black'); --正常用逗号隔开
Query OK, 2 rows affected (0.00 sec)
mysql> select * from t5;
+--------+-------------+
| sex | color |
+--------+-------------+
| female | black |
| male | black,green |
+--------+-------------+
2 rows in set (0.01 sec)