ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2022-01-30 09:00:08  阅读:165  来源: 互联网

标签:OK MySQL 数据类型 affected sec 第七章 mysql Query row


目录

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

查看文件物理大小:

 

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

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

 

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

mysql> optimize table t;

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

 

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

 

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)

 

标签:OK,MySQL,数据类型,affected,sec,第七章,mysql,Query,row
来源: https://www.cnblogs.com/19930521zhang/p/14756433.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有