🗒️MySQL bit 和 thinyint

type
status
slug
date
summary
tags
category
password
icon

bittinyint的对比与隐式转换问题

特性
bit(1)
tinyint(1)
存储类型
二进制值(b'0'b'1'
整数值(01,但可存储更大范围)
最小存储单元
1 位,但在计某些算机硬件上,字节才是最小的存储单元,MySQL会将其存储为一个字节(8位),这意味着即使只使用1位,也会占用与TINYINT相同的空间。应该是多数
1 字节
存储范围
仅支持01
有符号:-128~127;无符号:0~255
默认显示格式
二进制字符串(如b'1'
整数(如1

隐式转换规则与索引问题

bit类型的隐式转换

  • 与数值比较(如status = 1):
    • bit转为整数(b'1' → 1b'0' → 0),索引可能生效。
  • 与字符串比较(如status = '1'):
    • bit转为字符串(b'1' → "1"b'0' → "0"),但二进制存储的字符串表示可能与预期不符,导致索引失效。
  • 索引影响
    • 若查询条件类型与bit存储类型不一致(如字符串),索引可能完全失效,引发全表扫描或数据匹配错误。
    • status = '1':字符串'1'的 ASCII 码为 49,与bit(1)b'1'(二进制值 1)不匹配,导致索引无法命中。
    • status = 1bit(1)会转为整数 1,条件成立。
    • 当查询条件中的status字段使用字符串'1'时,索引要求 MySQL 将bit(1)值转换为 ASCII 码进行比较。由于b'1'的二进制值为 1,与字符串'1'的 ASCII 码 49 不匹配,导致查询失败。

tinyint类型的隐式转换

  • 与字符串比较(如status = '1'):
    • 字符串转为整数('1' → 1),与tinyint存储类型一致,索引正常生效。
  • 与其他类型比较
    • 自动转换为整数,兼容性更好。

结论

2025 年了
内存啥价钱、磁盘啥价钱,这能节约几个钱
省下来这点钱都不够出一问题的,我基本都用 tinyint 来存储 boolean 格式
工作经验告诉我,不要考虑太省钱(特别是细节的地方,要给自己留安全生产余地和优化空间)
  1. ECS 迁移的时候,做备份也就几毛钱几块钱,没有做,数据差点丢失
  1. 我考虑节约空间,出问题要自己背
  1. 线上问题-我就加了个索引怎么就导致线上事故了 忽然看到这篇文章分享,才发现还有这个知识点
 

实验 case

上一篇
The MySQL server is running with the --read-only option so it cannot execute this statement
下一篇
MySQL索引区分度低 特殊情况执行扫表CPU100%
Loading...
文章列表
王小扬博客
云原生
Git
Elasticsearch
Apollo
产品
Think
生活技巧
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP