MySQL学习总结之路(第七章:选择合适的数据类型)

目录

MySQL学习总结之路(第一章:服务与数据库管理)

MySQL学习总结之路(第二章:表)

MySQL学习总结之路(第三章:数据类型)

MySQL学习总结之路(第四章:运算符)

MySQL学习总结之路(第五章:函数)

MySQL学习总结之路(第六章:表类型【存储引擎】的选择)

MySQL学习总结之路(第七章:选择合适的数据类型)

1、char与varchar

    CHAR 和 VARCHAR 的对比

CHAR(4) 存储需求  VARCHAR(4)  存储需求
''   ' '   4 个字节 '' 1 个字节
'ab' 'ab '  4 个字节 'ab '  3 个字节
'abcd' 'abcd' 4 个字节 'abcd'   5 个字节
'abcdefgh'  'abcd' 4 个字节 'abcd'   5 个字节

 

从 CHAR(4)和 VARCHAR(4)列检索的值并不总是相同,因为检索时从 CHAR 列删除了尾部的空格。

mysql>  CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.55 sec)

mysql> INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;
+----------------+----------------+
| CONCAT(v, '+') | CONCAT(c, '+') |
+----------------+----------------+
| ab +           | ab+            |
+----------------+----------------+
1 row in set (0.04 sec)

 

2、text和blob

  区别: BLOB 能用来保存二进制数据;TEXT 只能保存字符数据

  (1)、创建测试表 t,字段 id 和 context 的类型分别为 varchar(100)和 text:

mysql> create table t (id varchar(100),context text);

Query OK, 0 rows affected (0.38 sec)

  (2)、往 t 中插入大量记录,这里使用 repeat 函数插入大字符串

mysql> insert into t values(1,repeat('haha',100));
Query OK, 1 row affected (0.08 sec)

mysql> insert into t values(2,repeat('haha',100));
Query OK, 1 row affected (0.00 sec)

mysql> insert into t values(3,repeat('haha',100));
Query OK, 1 row affected (0.00 sec)

mysql> insert into t select * from t;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
.
.
.
.
mysql> insert into t select * from t;
Query OK, 196608 rows affected (4.05 sec)
Records: 196608  Duplicates: 0  Warnings: 0

查看文件物理大小:

MySQL学习总结之路(第七章:选择合适的数据类型)

 

   (3)、删除id=1的数据后,再看物理文件大小,文件大小没有发生改变

mysql> delete from t where id =1;
Query OK, 131072 rows affected (2.13 sec)

MySQL学习总结之路(第七章:选择合适的数据类型)

 

   (4)、 OPTIMIZE(优化)操作,再看物理文件大小,瞬间变小了

mysql> optimize table t;

+--------+----------+----------+----------+
| Table  | Op       | Msg_type | Msg_text |
+--------+----------+----------+----------+
| test.t | optimize | status   | OK       |
+--------+----------+----------+----------+
1 row in set (0.69 sec)

MySQL学习总结之路(第七章:选择合适的数据类型)

 

 可以发现,表的数据文件大大缩小,“空洞”空间已经被回收。

 

3、浮点数与定点数

  c1 列的值由 131072.32 变成了 131072.31,这是上面的数值在使用单精度浮点数表示时,产生了误差。这是浮点数特有的问题。

  因此在精度要求比较高的应用中(比如货币)要使用定点数而不是浮点数来保存数据。

mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));
Query OK, 0 rows affected (0.41 sec)

mysql> insert into test values(131072.32,131072.32);
Query OK, 1 row affected (0.04 sec)

mysql> select * from test;
+-----------+-----------+
| c1        | c2        |
+-----------+-----------+
| 131072.31 | 131072.32 |
+-----------+-----------+
1 row in set (0.00 sec)

  浮点型数据保存小数时,要注意四舍五入的问题,并尽量保留足够的小数位,避免存储的数据不准确。

mysql> create table t (f float( 8,1));
Query OK, 0 rows affected (0.12 sec)

mysql> desc t;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| f     | float(8,1) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> insert into t values (1.23456);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t;
+------+
| f    |
+------+
|  1.2 |
+------+
1 row in set (0.00 sec)

mysql> insert into t values (1.25456);
Query OK, 1 row affected (0.03 sec)

mysql> select * from t;
+------+
| f    |
+------+
|  1.2 |
|  1.3 |
+------+
2 rows in set (0.00 sec)

 

上一篇:杨辉三角--蓝桥杯,C


下一篇:c++多维数组