目录
1.数值类型
1.2 tinyint类型
2.bit类型
3.小数类型
3.1 float
3.2 decimal
4.字符类型
4.1 char
4.2 varchar
4.3 char 和 varchar 比较
5. 日期类型
6. enum 和 set
6.2 set和enum的查找
6.2.1 enum的查找
6.2.2 set的查找
只能表示 -128~127的数字,超过不会发生截断而是直接报错。
如果带上 unsigned 可以表示0~255的数字
mysql> create table tt1(num tinyint);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into tt1 values(1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt1 values(128);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
相当于设置了一个m位的位图
mysql> insert into tt4 values(10, 10);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt4 values(65, 65);
Query OK, 1 row affected (0.01 sec)
mysql> insert into tt4 values(66, 66);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt4 values(70, 70);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt4 values(97, 97);
Query OK, 1 row affected (0.00 sec)
mysql> select * from tt4;
+------+------+
| id | a |
+------+------+
| 10 |
|
| 65 | A |
| 66 | B |
| 70 | F |
| 97 | a |
+------+------+
5 rows in set (0.00 sec)
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
mysql> create table float_t( id int, salary float(6,2));
在有些版本中也可以插入诸如 9999.990 这样的数字,MySQL只会四舍,不会五入。
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
mysql> create table t1 ( id int, salary float(10,8), salary2 decimal(10,8));
decimal和float很像,但是float和decimal表示的精度不一样。
如果希望小数的精度高,推荐使用decimal
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
mysql> create table tt9(id int, name char(2));
注意MySQL中的字符,可以是'a' 'b' '1' '2' 这样的,也可以是一个汉字。
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
用法和char一模一样
至于为什么是变长的,是因为varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。
编码是utf8时,varchar(n)的参数n最大值是65532/3=21844
因为utf中,一个字符占用3个字节
如果编码是gbk,varchar(n)的参数n最大是65532/2=32766
因为gbk中,一个字符占用2字节。
其中 timestamp 在插入时不需要手动的写。它会根据最后 插入/修改 数据的时间自行修改。
mysql> create table time1(
-> t1 date,
-> t2 datetime,
-> t3 timestamp
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into time1 (t1,t2) values('1949-10-1','2023-04-15 15:28:59');
Query OK, 1 row affected (0.01 sec)
mysql> select * from time1;
+------------+---------------------+---------------------+
| t1 | t2 | t3 |
+------------+---------------------+---------------------+
| 1949-10-01 | 2023-04-15 15:28:59 | 2023-04-15 15:29:13 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)
enum——从所给选项中单选。
set——从所给选项中多选。
这两个类型对插入时的约束更强,只能插入创建时所给的内容的一部分。这里既可以是以''形式插入,也可以是比特位插入。
gender enum('男','女'); 那么代表0001 ->1 为男,0010 ->2 为女。
hobby set('write','swim','game')); 0001->1 为write 0010 -> 2 为swim 0100->4代表game
mysql> create table t2( name varchar(20), gender enum('男','女'), hobby set('write','swim','game'));
Query OK, 0 rows affected (0.01 sec)
mysql> desc t2;
+--------+----------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------------------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| gender | enum('男','女') | YES | | NULL | |
| hobby | set('write','swim','game') | YES | | NULL | |
+--------+----------------------------+------+-----+---------+-------+
mysql> insert into t2 (name,gender,hobby)
-> values('张三','男','game,swim');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t2;
+--------+--------+-----------+
| name | gender | hobby |
+--------+--------+-----------+
| 张三 | 男 | swim,game |
+--------+--------+-----------+
1 row in set (0.00 sec)
mysql> insert into t2 values('李四',1,1);
Query OK, 1 row affected (0.01 sec)
mysql> insert into t2 values('王五',2,3);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+--------+--------+------------+
| name | gender | hobby |
+--------+--------+------------+
| 张三 | 男 | swim,game |
| 李四 | 男 | write |
| 王五 | 女 | write,swim |
+--------+--------+------------+
3 rows in set (0.00 sec)
mysql> select * from t2;
+--------+--------+-----------------+
| name | gender | hobby |
+--------+--------+-----------------+
| 张三 | 男 | swim,game |
| 李四 | 男 | write |
| 王五 | 女 | write,swim |
| 赵六 | 女 | game |
| 田七 | 女 | write,game |
| 中国 | 女 | swim,game |
| 人民 | 男 | write,swim,game |
+--------+--------+-----------------+
7 rows in set (0.00 sec)
使用' ' 或者 数字都可以查找到
mysql> select * from t2 where gender='男';
mysql> select * from t2 where gender=1;
同enum,但是有个缺陷,只能查找到恰好为目标的对象。
mysql> select * from t2 where hobby=1;
+--------+--------+-------+
| name | gender | hobby |
+--------+--------+-------+
| 李四 | 男 | write |
+--------+--------+-------+
要想查询到包换目标的所有对象,需要使用函数 find_in_set
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;
mysql> select find_in_set('a','a,b,c');
+--------------------------+
| find_in_set('a','a,b,c') |
+--------------------------+
| 1 |
+--------------------------+
1 row in set (0.00 sec)
mysql> select find_in_set('a','b,a,c');
+--------------------------+
| find_in_set('a','b,a,c') |
+--------------------------+
| 2 |
+--------------------------+
1 row in set (0.00 sec)
mysql> select find_in_set('a','b,d,c');
+--------------------------+
| find_in_set('a','b,d,c') |
+--------------------------+
| 0 |
+--------------------------+
mysql> select * from t2 where find_in_set('write',hobby);
+--------+--------+-----------------+
| name | gender | hobby |
+--------+--------+-----------------+
| 李四 | 男 | write |
| 王五 | 女 | write,swim |
| 田七 | 女 | write,game |
| 人民 | 男 | write,swim,game |
+--------+--------+-----------------+