MySQL--数据类型--0409

目录

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的查找


1.数值类型

MySQL--数据类型--0409_第1张图片

1.2 tinyint类型

只能表示 -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

2.bit类型

bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。

相当于设置了一个m位的位图

  • bit字段在显示的时候,是按照ASCII码对应的值显示的。比如
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)
  • 如果我们有这样的值,只存放0或1,这时可以定义bit(1)。这样可以节省空间。

3.小数类型

3.1 float

float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

mysql> create table float_t( id int, salary float(6,2));

MySQL--数据类型--0409_第2张图片

 在有些版本中也可以插入诸如 9999.990 这样的数字,MySQL只会四舍,不会五入。

3.2 decimal

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数

mysql> create table t1 ( id int, salary float(10,8), salary2 decimal(10,8));

MySQL--数据类型--0409_第3张图片

decimal和float很像,但是float和decimal表示的精度不一样。

如果希望小数的精度高,推荐使用decimal

 4.字符类型

4.1 char

char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255

mysql> create table tt9(id int, name char(2));

MySQL--数据类型--0409_第4张图片

注意MySQL中的字符,可以是'a' 'b' '1' '2' 这样的,也可以是一个汉字。

4.2 varchar

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字节。

4.3 char 和 varchar 比较

  • 定长的意义是,直接开辟好对应的空间
  • 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少

5. 日期类型

  • date :日期 'yyyy-mm-dd' ,占用三字节
  • datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
  • timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节

其中 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)

MySQL--数据类型--0409_第5张图片

6. enum 和 set

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)

6.2 set和enum的查找

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)

6.2.1 enum的查找

 使用' ' 或者 数字都可以查找到

mysql> select * from t2 where gender='男';
mysql> select * from t2 where gender=1;

6.2.2 set的查找

同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 |
+--------+--------+-----------------+

你可能感兴趣的:(MySQL,mysql,数据库)