Sql server 在SQL Server中指定列的长度

Sql server 在SQL Server中指定列的长度,sql-server,types,Sql Server,Types,制作一个列(例如,长度为3位的整数,而某些列只包含一个或两个)有危险吗?您不能制作一个长度为3位的整数。整数从负20亿变为正20亿,需要4字节,除非(成功)使用压缩 您可以使用SMALLINT来节省两个字节,但为了将其保留为3位,您需要在列

制作一个列(例如,长度为3位的整数,而某些列只包含一个或两个)有危险吗?

您不能制作一个长度为3位的整数。整数从负20亿变为正20亿,需要4字节,除非(成功)使用压缩


您可以使用
SMALLINT
来节省两个字节,但为了将其保留为3位,您需要在
列<1000
处添加一个检查约束。除非使用压缩,否则您仍然无法在较小的值上再次节省空间(例如,单个数字仍然需要2个字节)。

您无法使用3位数字生成整数。整数从负20亿变为正20亿,需要4字节,除非(成功)使用压缩

您可以使用
SMALLINT
来节省两个字节,但为了将其保留为3位,您需要在
列<1000
处添加一个检查约束。除非使用压缩,否则您仍然无法在较小的值上再次节省空间(例如,单个数字仍然需要2个字节)。

Sql Server中的一个值是4个字节,因此您将无法执行所描述的操作。值的范围从
-2147483648
2147483647

如果您只想存储最多3位的数字,则一个
smallint
就足够了(2个字节)。

Sql Server中的一个是4个字节,因此您将无法执行所描述的操作。值的范围从
-2147483648
2147483647


如果您只想存储最多3位的数字,则
smallint(2字节)就足够了。

int具有预定义的存储大小。你不能改变它


您可能正在考虑在哪里可以指定精度。

int具有预定义的存储大小。你不能改变它


您可能正在考虑指定精度的位置。

您可以选择使用十进制类型,如下所示:

create table #MyTable
(
    NotOneThousand decimal(3,0)
)

insert into #MyTable select 999
insert into #MyTable select 1000 -- fails
insert into #MyTable select -999
insert into #MyTable select -1000 -- fails

select * from #MyTable

drop table #MyTable
或使用检查约束,例如:

create table #MyTable
(
    NotOneThousand smallint check (NotOneThousand between 0 and 999)
)

insert into #MyTable select -1 -- fails
insert into #MyTable select 0
insert into #MyTable select null
insert into #MyTable select 999
insert into #MyTable select 1000 -- fails

select * from #MyTable

drop table #MyTable

您可以选择使用十进制类型,如下所示:

create table #MyTable
(
    NotOneThousand decimal(3,0)
)

insert into #MyTable select 999
insert into #MyTable select 1000 -- fails
insert into #MyTable select -999
insert into #MyTable select -1000 -- fails

select * from #MyTable

drop table #MyTable
或使用检查约束,例如:

create table #MyTable
(
    NotOneThousand smallint check (NotOneThousand between 0 and 999)
)

insert into #MyTable select -1 -- fails
insert into #MyTable select 0
insert into #MyTable select null
insert into #MyTable select 999
insert into #MyTable select 1000 -- fails

select * from #MyTable

drop table #MyTable

谢谢我想说的是女巫。这是如何改变的?@darrinceil如果你真的在存储数字,不要使用
nvarchar
为什么会这样?我想只是占用了更多的内存?@DarrinCecil如果你使用nvarchar存储数字(你必须在查询或编程语言中转换为int等),那么nvarchar(3)将比smallint占用更多的空间。“这不好的原因还有很多。”达林塞西,伊卡洛斯是对的。当然,一般公众可能无法插入,但您和任何其他维护开发人员都可以。现在这个系统没有自我记录,有人可能最终会在那里放垃圾,因为他们不知道有什么更好的。一个测试数据发生器会把垃圾放进去。我觉得有趣的是,你似乎担心储存这么小的东西的影响,但不关心类型安全。谢谢。我想说的是女巫。这是如何改变的?@darrinceil如果你真的在存储数字,不要使用
nvarchar
为什么会这样?我想只是占用了更多的内存?@DarrinCecil如果你使用nvarchar存储数字(你必须在查询或编程语言中转换为int等),那么nvarchar(3)将比smallint占用更多的空间。“这不好的原因还有很多。”达林塞西,伊卡洛斯是对的。当然,一般公众可能无法插入,但您和任何其他维护开发人员都可以。现在这个系统没有自我记录,有人可能最终会在那里放垃圾,因为他们不知道有什么更好的。一个测试数据发生器会把垃圾放进去。我觉得有趣的是,您似乎担心存储这么小的东西的影响,但不关心类型安全。