1. 数据类型

1.1 基本类型表格

类型 长度(bytes) 描述
CHAR 0-255 定长字符串
VARCHAR 0-65535 变长字符串
TINYBLOB 0-255 二进制变长字符串
TINYTEXT 文本变长字符串
BLOB 0-65535
TEXT
MEDIUMBLOB 0-16777215
MEDIUMTEXT
LONGBLOB 0-4294967295
LONGTEXT

1.2 varchar与char类型

  1. 字符串长度是字符数不是字节数,使用不同的字符集,会使用不同的存储空间。 | | VARCHAR | CHAR | | —- | —- | —- | | 存储空间 |
    1. 可能varchar更节省空间(也不一定:MYSQL使用ROW_FORMAT=FIXED时,VARCHAR也是定长);
    1. VARCHAR需要额外的空间(1或2字节)来标识当前行有具体的长度(存储VARCHAR(10)需要11字节,VARCHAR(1000)需要1002字节),而CHAR不需要额外空间;
    1. VARCHAR可能让页存不下数据,则需要发生页分裂;
    | | | 数据格式化 | 不处理 |
    1. 删除末尾的空格
    1. 用空格在末尾填充剩余空间
    1. 检索时去除末尾空格
    | | Innodb | 过长的VARCHAR存储为BLOB | | | | | |

1.2.1 binary与varbinary类型

  1. 与char和varchar类似,区别在于:

    1. 只是存储的是二进制字符串,但是二进制字符串存储的是字节码而不是字符。
    2. 填充binary使用\0(零字节)而不是空格,检索时不会去掉填充值。

      1.3 blob与text类型

  2. BLOB和TEXT都为存储大数据而存在,分别采用二进制(没有排序规则和字符集)和字符方式存储。

  3. 当存储值太大时,Innodb会使用专门“外部”存储区域来存储,此时数据行行内需要1~4个字节存储外部指针。
  4. mysql对其进行排序:只对每个列最前max_sort_length字节做排序。可以配置max_sort_length,或使用 order by sustring(column, length)。
  5. 不能全部长度进行索引,也不能使用这些索引消除排序。

    EXPLAIN的Extra列包含“Using temporary”,则说明这个查询使用了隐式临时表。

1.4 使用枚举(ENUM)代替字符串

  1. 枚举字段是按照内部存储的整数来存储的。
  2. 排序按照内部存储的整数来排序。
  3. 枚举添加或删除字符串必须使用ALTER TABLE。

    最好就不使用枚举了,用tinyint替代。