String Types
TiDB 支持所有 MySQL 的字符串类型,包括 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET。更多信息请参见 String Types in MySQL。
支持的类型
CHAR 类型
CHAR 是固定长度字符串。M 表示列的长度(以字符为单位,而非字节)。M 的取值范围为 0 到 255。与 VARCHAR 类型不同,当数据插入到 CHAR 列时,尾部空格会被截断。
[NATIONAL] CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]
VARCHAR 类型
VARCHAR 是可变长度字符串。M 表示最大列长度(以字符为单位,而非字节)。VARCHAR 的最大尺寸不能超过 65,535 字节。最大行长度和所使用的字符集共同决定 VARCHAR 的长度。
不同字符集的单个字符占用的字节数可能不同。下表显示了每个字符集中的单个字符所占的字节数,以及每个字符集中的 VARCHAR 列长度范围:
| 字符集 | 每个字符的字节数 | 最大 VARCHAR 列长度范围 |
|---|---|---|
| ascii | 1 | (0, 65535] |
| latin1 | 1 | (0, 65535] |
| binary | 1 | (0, 65535] |
| utf8 | 3 | (0, 21845] |
| utf8mb4 | 4 | (0, 16383] |
[NATIONAL] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name]
TEXT 类型
TEXT 是可变长度字符串。最大列长度为 65,535 字节。可选的 M 参数以字符为单位,用于自动选择最合适的 TEXT 类型。例如 TEXT(60) 会生成一个 TINYTEXT 类型,最多可存储 255 字节,适合存储最多 60 个字符(每个字符最多 4 字节,4×60=240)。不建议使用 M 参数。
TEXT[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]
TINYTEXT 类型
TINYTEXT 类型类似于 TEXT 类型。区别在于 TINYTEXT 的最大列长度为 255。
TINYTEXT [CHARACTER SET charset_name] [COLLATE collation_name]
MEDIUMTEXT 类型
MEDIUMTEXT 类型类似于 TEXT 类型。区别在于 MEDIUMTEXT 的最大列长度为 16,777,215。但由于 txn-entry-size-limit 的限制,TiDB 中单行的最大存储大小默认为 6 MiB,可以通过修改配置将其提高到 120 MiB。
MEDIUMTEXT [CHARACTER SET charset_name] [COLLATE collation_name]
LONGTEXT 类型
LONGTEXT 类型类似于 TEXT 类型。区别在于 LONGTEXT 的最大列长度为 4,294,967,295。但由于 txn-entry-size-limit 的限制,TiDB 中单行的最大存储大小默认为 6 MiB,可以通过修改配置将其提高到 120 MiB。
LONGTEXT [CHARACTER SET charset_name] [COLLATE collation_name]
BINARY 类型
BINARY 类型类似于 CHAR 类型。区别在于 BINARY 存储二进制字节字符串。
BINARY(M)
VARBINARY 类型
VARBINARY 类型类似于 VARCHAR 类型。区别在于 VARBINARY 存储二进制字节字符串。
VARBINARY(M)
BLOB 类型
BLOB 是大型二进制文件。M 表示最大列长度(以字节为单位),范围为 0 到 65,535。
BLOB[(M)]
TINYBLOB 类型
TINYBLOB 类型类似于 BLOB 类型。区别在于 TINYBLOB 的最大列长度为 255。
TINYBLOB
MEDIUMBLOB 类型
MEDIUMBLOB 类型类似于 BLOB 类型。区别在于 MEDIUMBLOB 的最大列长度为 16,777,215。但由于 txn-entry-size-limit 的限制,TiDB 中单行的最大存储大小默认为 6 MiB,可以通过修改配置将其提高到 120 MiB。
MEDIUMBLOB
LONGBLOB 类型
LONGBLOB 类型类似于 BLOB 类型。区别在于 LONGBLOB 的最大列长度为 4,294,967,295。但由于 txn-entry-size-limit 的限制,TiDB 中单行的最大存储大小默认为 6 MiB,可以通过修改配置将其提高到 120 MiB。
LONGBLOB
ENUM 类型
ENUM 是一种字符串对象,其值从在创建表时显式列出允许值的列表中选择。语法如下:
ENUM('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]
# 例如:
ENUM('apple', 'orange', 'pear')
ENUM 数据类型的值以数字存储。每个值根据定义顺序转换为数字。在前述示例中,每个字符串映射为一个数字:
| 值 | 数字 |
|---|---|
| NULL | NULL |
| '' | 0 |
| 'apple' | 1 |
| 'orange' | 2 |
| 'pear' | 3 |
更多信息请参见 the ENUM type in MySQL。
SET 类型
SET 是一种字符串对象,可以包含零个或多个值,每个值必须从在创建表时指定的允许值列表中选择。语法如下:
SET('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]
# 例如:
SET('1', '2') NOT NULL
在示例中,以下任意值都可以是有效的:
''
'1'
'2'
'1,2'
在 TiDB 中,SET 类型的值会被内部转换为 Int64。每个元素的存在用二进制表示:0 或 1。对于指定为 SET('a','b','c','d') 的列,其成员对应的十进制和二进制值如下:
| 成员 | 十进制值 | 二进制值 |
|---|---|---|
| 'a' | 1 | 0001 |
| 'b' | 2 | 0010 |
| 'c' | 4 | 0100 |
| 'd' | 8 | 1000 |
在这种情况下,元素 ('a', 'c') 的二进制表示为 0101。
更多信息请参见 the SET type in MySQL。