MySQL从零开始 4-MySQL的数据类型

 数据库是与数据打交道的工具,所以也存在自己的数据类型,接下来介绍MySQL提供的数据类型。

1. MySQL数据类型

1.1 数值类型

  • bit(m)

 1字节。m指定位数,默认为1,存储范围依次为1~64.

  • tinyint [unsigned]

 1字节。存储范围为 -128 ~ 127,unsigned为 0~256。

  • smallint [unsigned]

 2字节。存储范围 -2^15 ~ 2^15-1,unsigned为 0~2^16-1。

  • int [unsigned]

 4字节。存储范围 -2^31 ~ 2^31-1,unsigned为 0~2^32-1。

  • bigint [unsigned]

 8字节,相当于Java/C中的long。存储范围 -2^63 ~ 2^63-1,unsigned为 0~2^64-1。

  • float(m, d) [unsigned]

 4字节。最大精度为小数点后7位,m指定数据显示长度,d表示小数点后位数。

  • double(m, d) [unsigned]

 8字节。最大精度为小数点后30位,m指定数据显示长度,d表示小数点后位数。

  • decimal(m, d) [unsigned]

 m指定数据显示长度,d表示小数点后位数

  • bool

 使用1和0表示真假。

1.2 文本,二进制类型

  • char(size)

 固定长度为size的字符串,size代表长度,最大为255。

扫描二维码关注公众号,回复: 1542009 查看本文章
  • varchar(size)

 可变长度字符串,最大为65535。

  • blob

 二进制数据。

  • text

 用来存放大文本,不支持全文索引,不支持默认值。

1.3 时间日期

  • data

 日期类型,”yyyy-mm-dd”。

  • datatime

 日期时间类型,”yyyy-mm-dd hh:MM:ss”。

  • timestamp

 时间戳。

1.4 String类型

  • enum

 枚举,每次只能使用单个元素。

  • set

 集合,可以使用多个元素。

数据类型

 值得注意的是,MySQL中的数据不能存储超出其范围的值,否则会报错。

 越界测试:

mysql> create database test;
Query OK, 1 row affected (0.05 sec)

mysql> use test;
Database changed
mysql> create table t1(id bit(1));
Query OK, 0 rows affected (0.33 sec)

mysql> insert into t1 values(0);
Query OK, 1 row affected (0.08 sec)

mysql> insert into t1 values(1);
Query OK, 1 row affected (0.06 sec)

mysql> insert into t1 values(2);
ERROR 1406 (22001): Data too long for column 'id' at row 1

运行结果

 可以看到,当存入越界的数据时,就会报错:

-- ERROR 1406 (22001): Data too long for column 'id' at row 1
ERROR 1406 (22001): Data too long for column 'id' at row 1

小建议:

 尽量不使用unsigned,因为可能带来一些意想不到的效果,熟悉C/C++编程的同学应该能体会到无符号数据带来的痛苦。

 另外,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,还不如设计时,将int类型提升为bigint类型。

 接下来就个别常用数据类型进行介绍。

2. bit的使用

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

 接着上面的例子,我们将表中存储的数据显示出来。

mysql> select * from t1;
+------+
| id   |
+------+
|      |
|     |
+------+

运行结果

 从结果中可以看到,存储至表内的0,1显示为空白和一个符号。这是因为bit字段在显示时,是按照ASCII码对应的值显示。有些ascii码是不可见的,要注意。如下例:


mysql> alter table t1 modify id bit(10);
Query OK, 2 rows affected (0.72 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into t1 values(65);
Query OK, 1 row affected (0.08 sec)

mysql> select * from t1;
+------+
| id   |
+------+
|      |
|     |
|  A   |
+------+
3 rows in set (0.00 sec)

运行结果

 bit类型的最大好处就是可以在特定的场合下节省空间。例如判断状态的场合,特定数字代表不同情况,这时每个数字使用int类型就会浪费很多空间,而使用bit就可以根据数字大小来设置位数节省空间。

3. 小数(浮点数)的使用

  • float

 float[(m, d)] [unsigned]

 m指定位数,d指定小数位数,四字节。

 float类型会自动四舍五入。当有一个 float(4,2) 类型的数据时,存入 99.986,会进位为 99.99,当存入 99.984时,会舍去得到 99.98。

 另外,float unsigned 的定义与整数数据类型不一样,无符号浮点数存储数值范围不会增大二倍,而是去掉负数部分的范围。从0开始。

 即float unsigned 从0开始,范围变为原来有符号时范围的一半(正半范围)。

 看下面的测试:

mysql> create table t2(price float(4, 2));
Query OK, 0 rows affected (0.31 sec)

mysql> insert into t2 values(99.986),(99.984);
Query OK, 2 rows affected (0.39 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t2;
+-------+
| price |
+-------+
| 99.99 |
| 99.98 |
+-------+
2 rows in set (0.00 sec)

mysql> alter table t2 modify price float(4, 2) unsigned;
Query OK, 2 rows affected (0.82 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into t2 values(100);
ERROR 1264 (22003): Out of range value for column 'price' at row 1

运行结果

  • decimal

 decimal(m,d) [unsigned]

 m指定长度,d表示小数点的位数。decimal和float类型使用原则一致,只是精度不一样。

 与float比起,decimal精度更高,float大约为小数点后7位,而decimal精度为小数点后30位。

 看下面的测试:

mysql> create table t3(a float(10, 8), b decimal(10, 8));
Query OK, 0 rows affected (0.51 sec)

mysql> insert into t3 values(10.12345678, 10.12345678);
Query OK, 1 row affected (0.05 sec)

mysql> select * from t3;
+-------------+-------------+
| a           | b           |
+-------------+-------------+
| 10.12345695 | 10.12345678 |
+-------------+-------------+
1 row in set (0.00 sec)

运行结果

 从上面的测试中,我们可以很明显的看到,decimal的精度要比float高得多。
如果希望小数的精度高,推荐使用decimal。

4. 字符串

  • char(L)

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

  • varchar(L)

 可变长度字符串,L表示字符长度,最大长度65535个字节.

 看下面的测试

-- char 测试

-- 创建表
mysql> create table t4(a char(2));
Query OK, 0 rows affected (0.39 sec)

-- 插入数据
mysql> insert into t4 values('ab'),('中国');
Query OK, 2 rows affected (0.09 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t4;
+------+
| a    |
+------+
| ab   |
| 中国 |
+------+
2 rows in set (0.00 sec)



-- varchar 测试

-- 创建表
mysql> alter table t4 modify a varchar(4);
Query OK, 2 rows affected (0.70 sec)
Records: 2  Duplicates: 0  Warnings: 0

-- 插入数据
mysql> insert into t4 values('abcd'), ('中国最强');
Query OK, 2 rows affected (0.05 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t4;
+----------+
| a        |
+----------+
| ab       |
| 中国     |
| abcd     |
| 中国最强 |
+----------+
4 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(21845) 的表
mysql> create table t5(name varchar(21845))charset=utf8;

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

创建一个数据类型为 varchar(21844) 的表
mysql> create table t5(name varchar(21844))charset=utf8;
Query OK, 0 rows affected (0.24 sec)

 另外,MySQL规定,一行记录的长度不能超过65535,看下面的例子。

5. 日期和时间类型

  • datetime

 时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从1000到9999,占用八字节。

  • date:日期

 ’yyyy-mm-dd’,占用三字节。

  • timestamp:时间戳

 从1970年开始到现在所经过的秒数,占用四字节。
时间戳不用人为设置,当拥有时间戳数据的表被修改的时候,时间戳数据会自动更新到修改表的时间。

 看下面的测试:

-- 创建表
mysql> create table t6(t1 date, t2 datetime, t3 timestamp);
Query OK, 0 rows affected (0.27 sec)

-- 第一次插入数据
mysql> insert into t6(t1, t2) values('2018-6-9', '2018-6-9 9:00:00');
Query OK, 1 row affected (0.07 sec)

mysql> select * from t6;
+------------+---------------------+---------------------+
| t1         | t2                  | t3                  |
+------------+---------------------+---------------------+
| 2018-06-09 | 2018-06-09 09:00:00 | 2018-06-09 08:58:29 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)

-- 第二次插入数据
mysql> insert into t6(t1, t2) values('2018-6-10', '2018-6-10 9:00:00');
Query OK, 1 row affected (0.05 sec)

mysql> select * from t6;
+------------+---------------------+---------------------+
| t1         | t2                  | t3                  |
+------------+---------------------+---------------------+
| 2018-06-09 | 2018-06-09 09:00:00 | 2018-06-09 08:58:29 |
| 2018-06-10 | 2018-06-10 09:00:00 | 2018-06-09 08:58:52 |
+------------+---------------------+---------------------+
2 rows in set (0.00 sec)

 从上面的测试结果我们可以看出,timestamp类型的t3自动被修改成我们第一次第二次修改表时的时间。

猜你喜欢

转载自blog.csdn.net/weixin_40739833/article/details/80630087
今日推荐