在(SQLite)SQL中,tinyint(3)是什么意思?

10

我知道 tinyint 是一个单字节整数(顺便问一下,它是有符号的还是无符号的?)。参数 (3) 代表什么意思?我已经搜索过了,但没找到答案。


我正在使用sqlite,我没有看到tinyinttinyint(3)之间的任何区别。 - mk12
2
@Mk12 这是因为SQLite“模拟实现”数据类型(基本上,它接受语法但忽略其余部分)。请仔细阅读手册。 - user166390
2个回答

7

SQLite在列上“模拟实现”数据类型。基本上,它接受标准的SQL语法,但忽略其他方面。(但请参见类型亲和性和强制转换。)

请参见“差异”文档中的清单类型

大多数SQL数据库引擎使用静态类型。每个表中的列都关联有一个数据类型,只允许存储该特定数据类型的值在该列中。SQLite通过使用显式类型定义来放松这种限制。在显式类型定义中,数据类型是值本身的属性,而不是存储该值的列的属性。因此,SQLite允许用户将任何数据类型的任何值存储到任何列中,而不考虑该列的声明类型。(对于这条规则有一些例外情况:INTEGER PRIMARY KEY列只能存储整数。并且当可以时,SQLite尝试将值强制转换为列的声明数据类型。)

还请参见 SQLite Version 3中的数据类型和类型亲和性:

列的亲和性由列的声明类型确定,按照以下顺序的规则确定:

  • 如果声明类型包含字符串 "INT",则分配 INTEGER 亲和性。

  • [为了简洁起见省略其他规则]


对于其他数据库,请参阅相应的数据库特定文档 :-)


6
请查看关于MySQL列类型定义的这篇博客
对于数字类型,长度修饰符实际上是显示宽度,与可以存储在字段中的内容无关。是的,就是这样——TINYINT(1)和TINYINT(4)都可以存储范围为-128..127的值(或对于无符号值为0..255),并且是绝对相同的数据类型,只有一个小细节(涉及日期检索——请参见下文)。
以下是直接从源代码中摘录的显示宽度的解释:
“显示宽度不限制可以存储在列中的值的范围,也不限制超出为列指定的宽度的值所显示的位数。例如,指定为SMALLINT(3)的列具有通常的SMALLINT范围-32768到32767,并且使用多于三个字符来显示超出三个字符允许的范围之外的值。”

2
这个问题是关于SQLite的,但我意识到原帖作者在你回答后添加了这个说明。另一个回答现在更相关,不确定为什么这个被接受了。 - BenMorel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接