1、MySQL的字段类型

  • MySQL列类型就是MySQL的数据类型

1.1、数值类型

1字节是8bit。

  1. BIT(M):位类型,M指定位数,默认值为1,范围是1-64。
  2. TINYINT[UNSIGNED]:占1个字节,带符号范围是[-128,127],不带符号的是[0,255],默认是带符号的。
  3. SMALLINT[UNSIGNED]:占2个字节,带符号范围是[-2^15,2^15-1],不带符号的是[0,2^16-1]
  4. MEDIUMINT[UNSIGNED]:占3个字节,带符号范围是[-2^23,2^23-1],不带符号的是[0,2^24-1]
  5. INT[UNSIGNED]:占4个字节,带符号范围是[-2^31,2^31-1],不带符号的是[0,2^32-1]
  6. BIGINT[UNSIGNED]:占8个字节,带符号范围是[-2^63,2^63-1],不带符号的是[0,2^64-1]
  7. FLOAT[UNSIGNED]:占4个字节
  8. DOUBLE[UNSIGNED]:占8个字节
  9. DECIMAL(M,D)[UNSIGNED]:定点数,M指定长度,D表示小数点的位数。

1.4、文本类型

  1. CHAR(size),固定长度字符串,最大是255。
  2. VARCHAR(size),可变长度字符串范围在[0,2^16-1]。

char(n)和varchar(n)中的n表示字符的个数,不代表字节个数。

  1. TEXT:范围是[0,2^16]。
  2. LONG TEXT:范围是[0,2^32]。

在不同编码

1.5、二进制数据类型

  1. BLOB:范围是[0,2^16]。
  2. LONG BLOB:范围是[0,2^32]。

1.6、日期类型

  1. DATE
  2. DATETIME
  3. TimeStamp

2、varchar长度设置

2.1、结论

  1. 结论:varchar长度需要多长就设置为多长,不必考虑2的幂。如果遇到varchar(256)的时候,那么何必不选择varchar(255),这样还能节省1个存储长度的字节。

2.2、varchar(n)的最大值字符数

  1. varchar(size)是保存多少个字符,而不是字节。
  2. varchar最大是可以保存65535字节,但是根据不同编码,才能决定具体保存多少个字符。
  3. 如果是utf8格式,无论数字、字母还是汉子,都可以存放n个。varchar(20),那么就是可以保存20个汉子。
    4.1. 如果是gbk,varchar(n)中每个字符最多占2个字节,长度不能超过(65535 - 3 / 2)。
    4.2. 如果是utf-8,varchar(n)中每个字符最多占3个字节,长度不能超过(65535 - 3 / 3)。

2.3、varchar(n)需要1-2个额外字节记录长度n的值

  1. 当n <= 255的时候,只需要1个字节记录(数据表示范围:0 ~ (2^8-1),即0~255;当n > 255的时候,那么需要2个字节存储n的值((2^8)~ (2^16)-1,即256~65535)。
  2. 那么varchar保存的实际值的长度保存在第一个或者前两个字节中。

a.如果varchar(20),实际是需要1+20个字节的存储空间;
b.如果varchar(255),实际是需要1+255个字节的存储空间;
c.如果varchar(256),实际是需要2+256个字节的存储空间;
d.如果varchar(500),实际是需要2+500个字节的存储空间.

2.4 关于内存对齐的问题

  1. (2^n - 1)是不能达到内存对其的目的,因为varchar长度是以实际保存的字符串长度为准的。另外,InnoDB是以page基本的存储单位,一页要么有一行要么有多行数据,数据的读取是基于page的,而不是按照行读取的。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐