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数据类型之浮点与二进制型数据使用案例总结的主要内容,如果未能解决你的问题,请参考以下文章