Sql server SQL Server中的二进制类型

Sql server SQL Server中的二进制类型,sql-server,binary,Sql Server,Binary,在SQL Server中,是否可以存储小于一个字节的内容 二进制[(n)]长度为n字节的固定长度二进制数据,其中n是从1到8000的值。存储大小为n字节 例如,如果我有8列作为用户首选项,我可以将它们存储为8个单独的列,组合数据大小为一个字节吗?或者这会占用8个字节。是否有其他数据库支持小于一个字节的bytes对象(或者可以与其他字节/二进制列打包) 在SQL Server二进制类型中,是否可以存储小于一个字节的内容? 例如,如果我有8列作为用户首选项,我可以将它们存储为8个单独的列,组合数据大

在SQL Server中,是否可以存储小于一个字节的内容

二进制[(n)]长度为n字节的固定长度二进制数据,其中n是从1到8000的值。存储大小为n字节

例如,如果我有8列作为用户首选项,我可以将它们存储为8个单独的列,组合数据大小为一个字节吗?或者这会占用8个字节。是否有其他数据库支持小于一个字节的
bytes
对象(或者可以与其他字节/二进制列打包)

在SQL Server二进制类型中,是否可以存储小于一个字节的内容?
例如,如果我有8列作为用户首选项,我可以将它们存储为8个单独的列,组合数据大小为一个字节吗

是的,是的

SQL Server将自动将多个
列压缩为一个字节:

SQL Server数据库引擎优化了
bit
列的存储如果表中有8个或更少的
列,则这些列存储为1字节
。如果有9到16位的列,则这些列存储为2个字节,依此类推

字符串值
'TRUE'
'FALSE'
可以转换为位值:
'TRUE'
转换为
1
'FALSE'
转换为
0

转换为
会将任何非零值提升为
1

我个人建议不要使用
'TRUE'
'FALSE'
字符串值到
列值的隐式转换,原因我将不一一赘述(我对t-SQL语法中缺少“
-literal”表示遗憾,尽管您总是可以使用
1
0


是否有其他数据库支持小于一个字节的字节对象(或者可以与其他字节/二进制列打包)

(请注意,SQL语言确实有一个内置的nullabe-
boolean
类型,用于表示表达式的中间结果,例如
EXISTS
WHERE
子句中的谓词,但SQL规范不要求实现将
boolean
作为列类型支持,这一点尚不明确。)这就是为什么SQL规范的作者需要一记耳光的原因)

-这就是为什么您会看到数十亿美元的生产数据库使用
char(1)
存储
'Y'
'N'

,但他们的文档并没有说明它是否会压缩位字段列


.旧版本支持
boolean
列-尽管它将
boolean
关键字转换为
tinyint(1)
。但是,如果它将多个单位列压缩为多个字节。

,对吗?@david542--
这就是为什么你看到数十亿美元的生产数据库使用char(1)
--lol,我在mysql5.7中使用了
TINYINT(1)
。@david542正确,表中的
n
-许多
列的存储要求是
ceil(n/8)
。一般来说,您最不担心的是存储。模式的正确性应该是第一优先事项。位标志很难在查询中使用,并且无法直接优化—假设您需要基于它们编写tsql查询。对于用户首选项列,可能不太重要—但您无法预测未来的ne当然,还有更改或扩展选项时会发生什么。