---
permalink: 2018/06/13/mysql/decimal-field-byte-calc/
title: DECIAML字段字节计算
tags:
    - MySQL
date: 2018-06-13 18:38:45
categories:
    - MySQL
---
## 前言

最近在看《深入浅出MySQL》一书，看到了数值类型那一节。里面介绍了一些常用字段的相关信息，如字节长度、最大值、最小值等。

当看到 `DECIMAL` 字段时，它的字节数是 `M+2`，这个让我很不解，是为什么？

## 查阅+理解

`DECIAML` 与 `FLOAT` 和 `DOUBLE` 的存储方式不同。

`FLOAT` 和 `DOUBLE` 是用二进制存储数据的，所以会有部分精度问题。

`DECIAML` 是用字符串的方式存储的，所以它不存在精度问题，那么它的长度就是存储字节的长度。

那么问题来了，例如：`DECIMAL(5,2)` 的最大值是 `999.99`，那么总长度也就是 `5+1`，又为什么是 `5+2` 呢？

## 隐藏的 `+`

第二天工作的时候，帮忙拉取一个数据，就手动操作了一把，其中两个数据要相加一下。当我看到那个 `+` 号时，我想通了。

`DECIMAL` 也是有符号位的，而当时我只看的最大值，如果看最小值的话，就能够想通为什么是 `M+2` 了。

所以最终 `DECIMAL` 的长度计算方式是：1个字节的符号位 + 一个字节的小数点位 + 纯数字的长度(M) = 1 + 1 + M = M + 2。

## 结语

困点得以解决，这种思考是被人直接告知要更加难得的，问题虽小，值得纪念。