内容小结:这篇学习了数值型(小数)数据,分析了精度丢失的问题并举例说明,也着重分析了varchar(n)与char(n) 类型使用时的注意细节点,比如它们占用的存储大小与占用的字符大小代码使用:创建表及指定浮点型数据类型语句、varchar(n) 与 char(n) 语句本节主要介绍数值型(小数)数据类型,下面表中列出了常见的三种浮点型数据。 | | | |
| | | |
| | | |
| | m = 总位数(必填 / 默认 10),n = 小数位(必填 / 默认 0) | |
上面的三种浮点型数据中,数值精度是不一样的,float 的精度最差,我们通过insert into语句,存储具有多位小数的数值,在查询时,可能会出现精度丢失的情况。如下面例子所示:-- 创建测试表,对比三种小数类型的表现CREATE TABLE IF NOT EXISTS t5 ( id INT, num1 FLOAT, -- 浮点型, num2 DOUBLE, -- 浮点型, num3 DECIMAL(10,2) -- 定点型,总10位,小数2位) DEFAULT CHARACTER SET utf8mb4;# 添加数据INSERT INTO t5 VALUES(1, 88.12345678912345, 88.12345678912345, 88.12345678912345)SELECT*FROM t5
- decimal可以存储的数值还是相当大的,最大可以存储65位的数值,而且存储最精确
| | |
| | n=1~255(定长),不足 n 位时自动用空格补全,查询时会自动去掉末尾空格 |
| | 1~65535字节(变长),仅存储实际字符数 + 1 字符长度标识,节省空间 |
| | 无需指定长度,最大存储 65535 字符,适合长文本(如备注、简介) |
| | 预定义枚举值,插入时只能选其中一个(或 NULL),最多支持 65535 个预定义值 |
- 注意:
n表示 “字符数”(不是字节数),比如VARCHAR(11)可存 11 个汉字 / 字母 / 数字(utf8mb4 编码下,1 个汉字占 4 字节,但n按字符数算)。 - varchar(size) 最大存储65535个字节,但是1-3个字节用来记录大小,实际可用的只有65532个字节,如果使用utf8编码,一个字符占用1-3个字节,这时的varchar(n)中的n的计算可能就为65532/3
- 举个例子,char(4)与varchar(4)占用多少存储空间,其实都是不确定,要看它们的编码是什么,如果是utf8,就分别占用12字节,15字节(有1-3个字节用来表示大小); 但是char(4)的字符长度是确定,不满4时,会自动空格填充
上面提及的注意点在下面软件中的编码过程中也进行了补充和强调。CREATE TABLE t6(`name` CHAR(255));CREATE TABLE t7(`name` VARCHAR(21844));CREATE TABLE t8(`name` VARCHAR(32766)) CHARSET gbk;
上面是创建表的过程,这个很好理解,创建的时候,你就要确定表头中都要有哪些信息要存储,所以要确定一下表头信息。CREATE TABLE t9( `name` CHAR(4));INSERT INTO t9 VALUES('abcd');INSERT INTO t9 VALUES('陆小凤牛');SELECT*FROM t9CREATE TABLE t10( `name` VARCHAR(4));INSERT INTO t10 VALUES('ab是谁');INSERT INTO t10 VALUES('你不知道');SELECT*FROM t10
什么时候推荐使用char呢?如果数据长度是确定的,就使用char就好,比如手机号、身份证号等,char的查询速度是比varchar要快的。