SMALLINT 数据类型

本文介绍了SMALLINT数据类型的功能及使用方法。这是一种精确数值类型,需要2个字节存储,适用于存储整数值。有符号范围为-32768至32767,无符号范围为0至65535。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SMALLINT 数据类型 [Numeric]

功能 

需要 2 个字节存储的整数。

语法 

UNSIGNED ] SMALLINT

用法 

SMALLINT 数据类型是一种精确数值数据类型,其精度在算术运算后不变。它需要 2 个字节存储。

有符号的 SMALLINT 值的范围是 –215 到 215 – 1,即 –32768 到 32767。

无符号的 SMALLINT 值范围是 0 到 216 – 1,即 0 到 65535。

标准和兼容性 
  • SQL/92    与 SQL/92 兼容。UNSIGNED 关键字是供应商扩展。

  • Sybase    带符号的数据类型与 Adaptive Server Enterprise 兼容。Adaptive Server Enterprise 不支持 UNSIGNED 数据类型。

<think>好的,用户之前询问了关于BIGINT类型的问题,现在转向了SMALLINT,并且希望了解其定义、使用场景以及与BIGINT的对比。根据用户提供的引用,SMALLINT在MySQL中占用2字节,有符号范围是-32768到32767,无符号则是0到65535。用户可能是在设计数据库时需要选择合适的整数类型,或者遇到了存储空间和范围的问题。 首先,我需要整理SMALLINT的基本定义,明确存储空间和数值范围。然后,使用场景部分需要结合用户提到的例子,比如年份、人口数量等,说明何时使用SMALLINT更合适。对比BIGINT时,要突出存储空间、范围以及性能差异,例如索引效率、查询速度等。 用户可能关心在具体应用中如何选择这两种类型,所以需要强调根据实际数据需求选择,避免资源浪费。此外,用户提供的引用提到SMALLINT后面的数字如smallint(9)不影响存储,这点需要澄清,避免误解。还要注意不同数据库系统的差异,比如MySQL和PostgreSQL是否有不同实现。 可能用户没有直接说出的是对性能影响的担忧,或者如何在不同的应用场景中权衡存储空间和数据范围。需要确保回答不仅对比两者,还给出实际例子,帮助用户更好理解何时使用哪种类型。最后,生成的问题要引导用户进一步思考,比如溢出处理、类型转换等,覆盖可能的后续疑问。</think>### SMALLINT 数据类型详解 #### **1. 定义** SMALLINT 是一种**小范围整数类型**,主要用于存储有限范围内的整数值: - **存储空间**:2字节(固定) - **典型范围**: - **有符号**:$-32,768$ 至 $32,767$(即 $-2^{15}$ 至 $2^{15}-1$) - **无符号**:$0$ 至 $65,535$(即 $0$ 至 $2^{16}-1$,需显式声明`UNSIGNED`)[^1][^2] 数学表达: $$ \text{有符号范围} = [-32768, 32767] $$ $$ \text{无符号范围} = [0, 65535] $$ --- #### **2. 使用场景** 1. **有限数值存储** - 年份(如 `2023`)、月份(`1-12`)、星期(`1-7`) - 人口数量(小型社区统计)、商品库存量(常规电商场景) - 状态标识码(如 `0=未激活,1=正常,2=冻结`) 2. **空间敏感场景** ```sql -- 存储用户年龄(0-150足够) CREATE TABLE users ( age SMALLINT UNSIGNED ); ``` 3. **性能优化** 相比 BIGINT(8字节),SMALLINT 在索引构建和全表扫描时**减少 75% 存储占用**,提升查询速度[^1]。 --- #### **3. 与 BIGINT 的对比** | **特性** | SMALLINT | BIGINT | |----------------|-----------------------------|---------------------------------| | **存储空间** | 2字节 | 8字节 | | **有符号范围** | $-32,768$ 至 $32,767$ | $-2^{63}$ 至 $2^{63}-1$ | | **无符号范围** | $0$ 至 $65,535$ | $0$ 至 $2^{64}-1$ | | **索引效率** | 更高(数据密度大) | 较低(数据密度小) | | **适用场景** | 有限数值、高频读写场景 | 超大数值、分布式系统主键 | **核心差异示例**: ```sql -- 错误案例:使用 BIGINT 存储年龄(浪费空间) CREATE TABLE user_profile ( age BIGINT -- ❌ 过度设计 ); -- 优化方案:改用 SMALLINT CREATE TABLE user_profile ( age SMALLINT UNSIGNED -- ✅ 精确匹配需求 ); ``` --- #### **4. 注意事项** 1. **显示宽度限制无效** 如 `SMALLINT(5)` 中的数字仅控制显示格式,**不改变实际存储范围**[^2]。 2. **类型转换风险** 混合使用 SMALLINT 与 BIGINT 可能导致隐式转换: ```sql SELECT * FROM table1 WHERE smallint_col = bigint_value; -- 可能触发全表扫描 ``` 3. **数据库实现差异** - **MySQL**:严格区分有符号/无符号 - **PostgreSQL**:提供 `SMALLSERIAL` 自增类型 - **SQLite**:动态类型下实际存储由数值决定 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值