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 格式
工作经验告诉我,不要考虑太省钱(特别是细节的地方,要给自己留安全生产余地和优化空间)