跳到主要内容

整数类型

整数类型为定长、精确的数值类型,值域取决于类型长度,以及是否为无符号,Precision 只表示最小显示宽度。

seekdb 所支持的每种整数类型所需的存储长度和值域如下表所示。

类型长度(字节)值域(有符号)值域(无符号)
BOOL/BOOLEAN/TINYINT1[-27, 27 - 1][0, 28 - 1]
SMALLINT2[-215, 215 - 1][0, 216 - 1]
MEDIUMINT3[-223, 223 - 1][0, 224 - 1]
INT/INTEGER4[-231, 231 - 1][0, 232 - 1]
BIGINT8[-263, 263 - 1][0, 264 - 1]
SERIAL8N/A[0, 264 - 1]

TINYINT

TINYINT 用于表示一个非常小的整数。语法如下:

TINYINT[(M)] [UNSIGNED] [ZEROFILL]

M 表示最大显示宽度。最大显示宽度为 255。显示宽度与可以存储的值范围无关。如果为数值列指定 ZEROFILL,seekdb 会自动向该列添加 UNSIGNED 属性。

BOOL/BOOLEAN

BOOL/BOOLEAN 类型是 TINYINT 的同义词。零值表示错误,非零值表示正确。

示例如下:

SELECT IF(0, 'true', 'false');

返回结果如下:

+------------------------+
| IF(0, 'true', 'false') |
+------------------------+
| false |
+------------------------+
1 row in set (0.001 sec)
SELECT IF(1, 'true', 'false');

返回结果如下:

+------------------------+
| IF(1, 'true', 'false') |
+------------------------+
| true |
+------------------------+
1 row in set (0.000 sec)
SELECT IF(2, 'true', 'false');

返回结果如下:

+------------------------+
| IF(2, 'true', 'false') |
+------------------------+
| true |
+------------------------+
1 row in set (0.000 sec)
SELECT IF(2 = FALSE, 'true', 'false');

返回结果如下:

+--------------------------------+
| IF(2 = FALSE, 'true', 'false') |
+--------------------------------+
| false |
+--------------------------------+
1 row in set (0.001 sec)

SMALLINT

SMALLINT 用于表示一个小值整数。语法如下:

SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

M 表示最大显示宽度。最大显示宽度为 255。显示宽度与可以存储的值范围无关。如果为数值列指定 ZEROFILL,seekdb会自动向该列添加 UNSIGNED 属性。

MEDIUMINT

MEDIUMINT 用于表示一个中等大小的整数。

语法如下:

MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

M 表示最大显示宽度。最大显示宽度为 255。显示宽度与可以存储的值范围无关。如果为数值列指定 ZEROFILL,seekdb 会自动向该列添加 UNSIGNED 属性。

INT/INTEGER

INTINTEGER 用于表示一个正常大小的整数。语法如下:

INT[(M)] [UNSIGNED] [ZEROFILL]
INTEGER[(M)] [UNSIGNED] [ZEROFILL]

M 表示最大显示宽度。最大显示宽度为 255。显示宽度与可以存储的值范围无关。如果为数值列指定 ZEROFILL,seekdb会自动向该列添加 UNSIGNED 属性。

另外,seekdb 还支持扩展类型 INT2INT4,但是推荐使用 INT 替换 INT4

BIGINT

BIGINT 用于表示一个大整数。语法如下:

BIGINT[(M)] [UNSIGNED] [ZEROFILL]

M 表示最大显示宽度。最大显示宽度为 255。显示宽度与可以存储的值范围无关。如果为数值列指定 ZEROFILL,seekdb会自动向该列添加 UNSIGNED 属性。

关于 BIGINT,需要注意以下事项:

  • 所有运算需要使用有符号的 BIGINTDOUBLE 值,因此不应使用大于 9223372036854775807(63 位)的无符号大整数,BIT 函数除外。否则,在将 BIGINT 值转换为 DOUBLE 时会出现舍入错误,导致结果中的最后一位数字可能出错。

  • 通过使用字符串存储 BIGINT,这样始终可以将精确的整数值存储在 BIGINT 列中。在这种情况下,在执行字符串到数字的转换时,不涉及双精度的中间转换。

  • 当两个操作数都是整数值时,-、+ 和 * 运算符使用 BIGINT 运算。如果将两个大整数(或函数返回的整数结果)相乘,当结果大于 9223372036854775807 时可能会得到异常的结果。

SERIAL

SERIAL 数据类型用来表示一个自动递增的大整数(大范围数字)列。当在列定义中使用 SERIAL 数据类型时,实际上定义了如下的列属性:

  • BIGINT:是一个大的整数数据类型,可以存储非常大的数。
  • UNSIGNED:表示该整数是无符号的,只能是正数或零。
  • NOT NULL:列值不可以为空,即每行都必须有个数值。
  • AUTO_INCREMENT:自动增长的标识,随着新行的插入,这个列的值会自动增加。
  • UNIQUE:确保列中的所有值都是唯一的。

具体来说,SERIAL 数据类型默认相当于创建一个 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 类型的列。使用 SERIAL 数据类型能够方便地创建具有唯一标识符的列,尤其适合用作表的主键。

示例如下:

  1. 使用下面 SQL 语句创建表 tbl1,定义两个字段:id 字段定义为 SERIAL 数据类型;name 字段定义为 VARCHAR(10) 数据类型。

    CREATE TABLE tbl1 (id SERIAL, name VARCHAR(10));
  2. 使用下面 SQL 语句查看表 tbl1 的定义。

    SHOW CREATE TABLE tbl1;

    返回结果如下:

    +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table |
    +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | tbl1 | CREATE TABLE `tbl1` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(10) DEFAULT NULL,
    UNIQUE KEY `id` (`id`) BLOCK_SIZE 16384 LOCAL
    ) AUTO_INCREMENT = 1 AUTO_INCREMENT_MODE = 'ORDER' DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 |
    +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.001 sec)