字段类型

布尔、整数、实数、字符串、日期时间、枚举

分类 字段类型 column 空间占用 范围 适用场景
整数 微整型 tinyInt 1字节 8位 0~255 、 -128~127 状态值,枚举值
整数 小整型 smallInt 2字节 16位 0~65535 排序值,权重
整数 中整型 mediumInt 3字节 24位 -8388608~8388607、0~16777215 F
整数 整型 int 4字节 32位 0~4294967295(42.9亿) 小量数据自增列, 低精度金额
整数 长整型 bigint 8字节 64位 0~18446744073709551615 分布式ID,大量数据自增列
—— —— —— —— —— —— ——
实数 单精度非精准浮点数 float(m,d) 4字节 32 m>d, m≤24 接受误差
实数 双精度非精准浮点数 double(m,d) 8字节 64 m>d, m≤65, d<30 接受误差,理论值比bigInt大
实数 精准浮点数 decimal(m,d) 8字节 64 默认decimal(10,0),范围等同double 通常用于财务计算
—— —— —— —— —— —— ——
字符串 定长字符串 char(n)     255个字符(字母、数字以及特殊字符) 手机号、身份证号、定长ID号、MD5
字符串 变长字符串 varchar(n)     最多 65535(表中所有列共享) 个字节 字长偏差较大的字符串,建议n≥20
2 bit 4 5 6 单个字符
—— —— —— —— —— —— ——
日期时间 日期 year 1 8 4位:1901/2155、2位:70/69(1970/2069) 年份值
日期时间 日期 date 3 24 1000-01-01/9999-12-31 日期值
日期时间 时间 time 3 24 -838:59:59/838:59:59 时间值或持续时间
日期时间 时间戳 timestamp 4 32 1970-01-01 00:00:00/2037 年某时 2037年以内的数据
日期时间 日期时间 datetime 8 64 1000-01-01 00:00:00/9999-12-31 23:59:59 超过2037年的时间数据
—— —— —— —— —— —— ——
文本 小型文本 tinyText 0~255字节   0~255 短文本字符串
文本 文本 text 0-65535字节   0~65535 长文本数据
文本 中型文本 mediumText 0-16777215字节   0~16777215 中等长度文本数据
文本 极大文本 longText 0-4294967295字节   0~4294967295 极大文本数据
—— —— —— —— —— —— ——
二进制文本 小型二进制字符串 tinyBlob 0~255字节   0~255 不超过255个字符的二进制字符串
二进制文本 二进制字符串 blob 0-65535字节   0~65535 二进制形式的长文本数据
二进制文本 中型二进制字符串 mediumBlob 0-16777215字节   0~16777215 二进制形式的中等长度文本数据
二进制文本 极大二进制字符串 longBlob 0-4294967295字节   0~4294967295 二进制形式的极大文本数据
—— —— —— —— —— —— ——
枚举 枚举类型 enum 4 5 0~65535 65535个以内枚举值,极少更新,支持按指定顺序存储
枚举 枚举类型 set 4 0~64 最多只能包含64个列表项,可存储一个以上的值 64个以内枚举值,极少更新
—— —— —— —— —— —— ——
布尔类型   boolean 1   ture、false 非此即彼
分类 字段类型 column 空间占用 范围 适用场景
1 2 3 4 5 6 7

整数类型

无符号数值范围:0 ~ 2<sup>n</sup> - 1
有符号数值范围:-2<sup>n-1</sup> ~2<sup>n-1</sup> - 1
int(n),无论n等于多少,int永远占4个字节;
n表示显示宽度,设置unsigned zerofill的前提下 不足用0补,数字长度超过n则显示整个数字

浮点数

float和double在不指定精度时,默认会按照实际的精度来显⽰,
DECIMAL在不指定精度时,默认整数为10,⼩数为0
decimal类型的数据,如果数据超过了精度和标度值,系统会报错
近似值:decimal采⽤的是四舍五⼊,float和double采⽤的是四舍六⼊五成双

四舍六⼊五成双:

5以下舍弃,5以上进位
5后⾯是否还有不为0的任何数字

    如果有,则直接进位
    如果没有

        看5前⾯的数字
        
            若是奇数则进位,
            若是偶数则将5舍掉

日期时间

timestamp满足使用时,比datetime更优
datetime 建议的默认时间 1970-01-01 08:00:01, 兼容大数据处理(Java认为timestamp的最小时间值)

varchar(n) 如果值的长度过大,则被转换为 TEXT 类型


*不建议使用的类型:

  • bit
  • BLOBs (Binary Large OBjects)

bigIng类型

Tip

mysql 的 bigInt 类型 数值 传递给前段时 需要强转为 string 类型,否则会丢失最后一位精度(四舍五入)

mysql 的 字段(如:goods_sn) char/varchar 类型 存储的值是 binInt 数值时, 字段作为查询条件,需要显式转换数据类型为 string,否则会出现异常

goods_sn = ‘291512717661962240', 会查询到 goods_sn = ‘291512717661962241‘的记录

SELECT `goods_sn`, `tenant_id`, `column_type`, max( id ) AS id 
FROM `ic_product_variation_edit_log` 
WHERE `tenant_id` = 500001 AND `goods_sn` = 291512717661962240  
GROUP BY `goods_sn`, `tenant_id`, `column_type`

| goods_sn | tenant_id | column_type | id | | —- | —- | —- | —- | | 291512717661962241 | 500001 | last_purchase_at | 1998 | | 291512717661962241 | 500001 | re_purchase_price | 1984 |

binInt 数值作为 字符串列的查询参数时,应显式转换为字符串

SELECT `goods_sn`, `tenant_id`, `column_type`, max( id ) AS id 
FROM `ic_product_variation_edit_log` 
WHERE `tenant_id` = 500001 AND `goods_sn` = '291512717661962240'
GROUP BY `goods_sn`, `tenant_id`, `column_type`

| goods_sn | tenant_id | column_type | id | | —- | —- | —- | —- | | (N/A) | (N/A) | (N/A) | (N/A) |

json

  • 存储前建议排序,比如存商品规格,应避免重复,排序后更方便
  • 注意数据类型格式化,避免 [{"goods_sn": "326540296949071872", "quantity": "1"}] 和 [{"goods_sn": "326540296949071872", "quantity": 1}]