Mysql数据类型之浮点与二进制型数据使用案例总结

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql数据类型之浮点与二进制型数据使用案例总结相关的知识,希望对你有一定的参考价值。

mysql数据类型之浮点与二进制型数据

数据类型概述


Mysql里的数据类型主要有数值型(整形、浮点型)、时间类型、字符串类型、JSON类型、坐标类型、混合类型(整数或字符串)。

数值型范围表格

数据类型

存储位数

数据范围

tinyint

1

有符号: -128–127  无符号: 0–255

smallint

2

有符号:--32768–32767 无符号:0–65535

mediumint

3

有符号:-8388608–8388607 无符号:0–16777215

int

4

有符号:-2147483648–2147483647 无符号: 0–4294967295

bigint

8

有符号: -2^63 - 2^63-1 无符号: 0–2^64-1

decimal(M, N)

1–29

M 1到65 N 0到38,M大于等于N

float

4

总位数65(其中小数部分38)

double

8

总位数65(其中小数部分38)

bit(M)

1-8

1-64 bits

decimal的说明

1 decimal(5,2) 即小数点后面是2位,总5位(整数部分3位),所以范围是-999.99-999.99。

2  decimal(m) 等价于decimal(m,0),即不含小数点部分。而decimal,即不指定精度时对应decimal(10,0)。

float double的说明

1 float可以指定存储“精度”(不是数据范围),形式为flaot(n),该精度n和影响其存储。当n在0和23之间则存储时需要4个字节,而24到53之间则需要8个字节。

2 float也可以指定数据精度,一般形式为flaot(M,D),M代表总数值的位数,而D是小数点后的位数,比如float(7,3)的数据范围是-9999.999到9999.999。

3 当float里指定了数据精度时,插入的数据将按照指定的精度四舍五入。比如在2里精度下9999.99859插入时将是9999.999,而9999.99849则是9999.998。

4 因为float和double存的是近似数,所以在做比较运算时可能会有问题。

bit的说明

1 bit类型是用来存二进制类型,它的一般形式是bit(M),其中M的范围是1到64。

比如b'111' and b'10000000' 分别对应十进制的7和128。

2 添加到bit类型里的数据如果位数小于指定的M,则左边自动补0。比如将b'101' 添加到列BIT(6)里时等价于b'000101'。

3 bit类型不指定精度时默认是1。

 代码验证

浮点型

DROP TABLE tb_fixpoint
CREATE TABLE tb_fixpoint
(id int auto_increment, 
decimal_1 decimal,
primary key(id)
)

-- 查看创建脚本
show create table tb_fixpoint;
CREATE TABLE `tb_fixpoint` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `decimal_1` decimal(10,0) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3


# 1 插入最多10位的整数
INSERT INTO tb_fixpoint VALUES(1,9999999999)
> Affected rows: 1
> 时间: 0.324s

# 2 插入11位以上数报错
INSERT INTO tb_fixpoint VALUES(2,10000000000)
> 1264 - Out of range value for column 'decimal_1' at row 1
> 时间: 0.001s
# 3 插入含小数点的数不报错,但实际截取小数点后的数
INSERT INTO tb_fixpoint VALUES(2,9999999999.2987)

SELECT * FROM tb_fixpoint


2 反例验证decimal范围
#2.1 整数部分最多65位
ALTER TABLE tb_fixpoint ADD decimal_2 decimal(66,29)
> 1426 - Too big precision 66 specified for 'decimal_2'. Maximum is 65
> 时间: 0s

#2.2 小数点最多38位
ALTER TABLE tb_fixpoint ADD decimal_2 decimal(65,39)
> 1425 - Too big scale 39 specified for 'decimal_2'. Maximum is 38
> 时间: 0s
#2.3 总位数65,小数点后最多38位。
ALTER TABLE tb_fixpoint ADD decimal_2 decimal(65,38)
> OK
> 时间: 0.47s

# 如果定义float(7,4)则存的范围是-9999.999到9999.999
UPDATE tb_fixpoint SET float_3=9999.999 WHERE id = 1;
UPDATE tb_fixpoint SET float_3=-9999.999 WHERE id = 2;

# 会按照四舍五入方式截断数据
UPDATE tb_fixpoint SET float_3=9999.99859 WHERE id = 2;
UPDATE tb_fixpoint SET float_3=9999.99849 WHERE id = 2;
-- 结果
9999.999
9999.998

bit型

# 新增bit类型
ALTER TABLE tb_fixpoint ADD bit_1 bit;
UPDATE tb_fixpoint SET bit_1=b'01' WHERE id = 1;
UPDATE tb_fixpoint SET bit_1=B'0' WHERE id = 2;
#这里不能写成0B,必须是小写的b。
UPDATE tb_fixpoint SET bit_1=0b01 WHERE id = 2;
#二进制数据只有0和1,2及其它数字都是错误输入。
UPDATE tb_fixpoint SET bit_1=b'02' WHERE id = 1;
> 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'b'02' WHERE id = 1' at line 1
> 时间: 0s
# 超出bit的范围
ALTER TABLE tb_fixpoint ADD bit_2 bit(65)
> 1439 - Display width out of range for 'bit_2' (max = 64)
> 时间: 0s

# 超出bit的范围,精度只到64.
ALTER TABLE tb_fixpoint ADD bit_2 bit(64)
> OK
> 时间: 0.692s


#插入65位二进制数据。
UPDATE tb_fixpoint SET bit_2=b'11111111111111111111111111111111111111111111111111111111111111110' WHERE id = 1
> 1264 - Out of range value for column 'bit_2' at row 1
> 时间: 0.001s

#插入64位二进制数据。
UPDATE tb_fixpoint SET bit_2=b'1111111111111111111111111111111111111111111111111111111111111111' WHERE id = 2
> Affected rows: 1
> 时间: 0.065s

#查看二进制数据及其字符编码
SELECT b'1000011', CHARSET(b'1000011');
结果为:C

#二进制数据结合字符集查看数据
SELECT _latin1 b'1000011';
SELECT _utf8 0b1000011 COLLATE utf8_danish_ci;

结果都是 C

完整脚本



SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tb_fixpoint
-- ----------------------------
DROP TABLE IF EXISTS `tb_fixpoint`;
CREATE TABLE `tb_fixpoint`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `decimal_1` decimal(10, 0) NULL DEFAULT NULL,
  `decimal_2` decimal(65, 38) NULL DEFAULT NULL,
  `float_1` float NULL DEFAULT NULL,
  `float_2` float NULL DEFAULT NULL,
  `float_3` float(7, 3) NULL DEFAULT NULL,
  `bit_1` bit(1) NULL DEFAULT NULL,
  `bit_2` bit(64) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_fixpoint
-- ----------------------------
INSERT INTO `tb_fixpoint` VALUES (1, 9999999999, NULL, NULL, NULL, 9999.999, b'1', NULL);
INSERT INTO `tb_fixpoint` VALUES (2, 9999999999, NULL, NULL, NULL, 9999.998, b'1', b'1111111111111111111111111111111111111111111111111111111111111111');

SET FOREIGN_KEY_CHECKS = 1;

以上是关于Mysql数据类型之浮点与二进制型数据使用案例总结的主要内容,如果未能解决你的问题,请参考以下文章

mysql工程师之04 数据类型

mysql工程师之04 数据类型

MySQL数据类型操作(char与varchar)

C语言学习 -- 整型与浮点型在内存中的存储

sqlite数据库相关总结

Golang系列之浮点型与复数类型