🗒️MySQL bit 和 thinyint
type
status
slug
date
summary
tags
category
password
icon
bit
与tinyint
的对比与隐式转换问题
特性 | bit(1) | tinyint(1) |
存储类型 | 二进制值( b'0' 或b'1' ) | 整数值( 0 或1 ,但可存储更大范围) |
最小存储单元 | 1 位,但在计某些算机硬件上,字节才是最小的存储单元,MySQL会将其存储为一个字节(8位),这意味着即使只使用1位,也会占用与TINYINT相同的空间。应该是多数 | 1 字节 |
存储范围 | 仅支持 0 或1 | 有符号:-128~127;无符号:0~255 |
默认显示格式 | 二进制字符串(如 b'1' ) | 整数(如 1 ) |
隐式转换规则与索引问题
bit
类型的隐式转换
- 与数值比较(如
status = 1
): bit
转为整数(b'1' → 1
,b'0' → 0
),索引可能生效。
- 与字符串比较(如
status = '1'
): bit
转为字符串(b'1' → "1"
,b'0' → "0"
),但二进制存储的字符串表示可能与预期不符,导致索引失效。
- 索引影响:
- 若查询条件类型与
bit
存储类型不一致(如字符串),索引可能完全失效,引发全表扫描或数据匹配错误。 status = '1'
:字符串'1'
的 ASCII 码为 49,与bit(1)
的b'1'
(二进制值 1)不匹配,导致索引无法命中。status = 1
:bit(1)
会转为整数 1,条件成立。- 当查询条件中的
status
字段使用字符串'1'
时,索引要求 MySQL 将bit(1)
值转换为 ASCII 码进行比较。由于b'1'
的二进制值为 1,与字符串'1'
的 ASCII 码 49 不匹配,导致查询失败。
tinyint
类型的隐式转换
- 与字符串比较(如
status = '1'
): - 字符串转为整数(
'1' → 1
),与tinyint
存储类型一致,索引正常生效。
- 与其他类型比较:
- 自动转换为整数,兼容性更好。
结论
2025 年了
内存啥价钱、磁盘啥价钱,这能节约几个钱
省下来这点钱都不够出一问题的,我基本都用 tinyint 来存储 boolean 格式
工作经验告诉我,不要考虑太省钱(特别是细节的地方,要给自己留安全生产余地和优化空间)
- ECS 迁移的时候,做备份也就几毛钱几块钱,没有做,数据差点丢失
- 我考虑节约空间,出问题要自己背
- 线上问题-我就加了个索引怎么就导致线上事故了 忽然看到这篇文章分享,才发现还有这个知识点
实验 case
上一篇
The MySQL server is running with the --read-only option so it cannot execute this statement
下一篇
MySQL索引区分度低 特殊情况执行扫表CPU100%
Loading...