整数类型
整数类型为定长、精确的数值类型,值域取决于类型长度,以及是否为无符号,Precision 只表示最小显示宽度。
seekdb 所支持的每种整数类型所需的存储长度和值域如下表所示。
| 类型 | 长度(字节) | 值域(有符号) | 值域(无符号) |
|---|---|---|---|
BOOL/BOOLEAN/TINYINT | 1 | [-27, 27 - 1] | [0, 28 - 1] |
SMALLINT | 2 | [-215, 215 - 1] | [0, 216 - 1] |
MEDIUMINT | 3 | [-223, 223 - 1] | [0, 224 - 1] |
INT/INTEGER | 4 | [-231, 231 - 1] | [0, 232 - 1] |
BIGINT | 8 | [-263, 263 - 1] | [0, 264 - 1] |
SERIAL | 8 | N/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
INT 或 INTEGER 用于表示一个正常大小的整数。语法如下:
INT[(M)] [UNSIGNED] [ZEROFILL]
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
M 表示最大显示宽度。最大显示宽度为 255。显示宽度与可以存储的值范围无关。如果为数值列指定 ZEROFILL,seekdb会自动向该列添加 UNSIGNED 属性。
另外,seekdb 还支持扩展类型 INT2 和 INT4,但是推荐使用 INT 替换 INT4。
BIGINT
BIGINT 用于表示一个大整数。语法如下:
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
M 表示最大显示宽度。最大显示宽度为 255。显示宽度与可以存储的值范围无关。如果为数值列指定 ZEROFILL,seekdb会自动向该列添加 UNSIGNED 属性。
关于 BIGINT,需要注意以下事项:
-
所有运算需要使用有符号的
BIGINT或DOUBLE值,因此不应使用大于 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 数据类型能够方便地创建具有唯一标识符的列,尤其适合用作表的主键。
示例如下:
-
使用下面 SQL 语句创建表
tbl1,定义两个字段:id字段定义为SERIAL数据类型;name字段定义为VARCHAR(10)数据类型。CREATE TABLE tbl1 (id SERIAL, name VARCHAR(10)); -
使用下面 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)