你如何真正在SQL Server中创建零长度二进制值?

时间:2018-03-21 16:54:55

标签: sql-server tsql

我正在写一个ODBC绑定,我决定实现对binary的支持,我发现如果我插入0x,假设是“空字符串”MSDN docs,那么返回一个字节的缓冲区,其中包含零。显然,这个长度不是0

1> CREATE TABLE demo (bar BINARY)
2> GO
1> INSERT INTO demo VALUES (0x)
2> GO
(1 rows affected)
1> SELECT * FROM demo WHERE bar = 0x00
2> GO
bar 
----
0x00

(1 rows affected)
1> SELECT DATALENGTH(bar) FROM demo WHERE bar = 0x00
2> go

-----------
          1

但是,如果直接选择它,则为空:

1> SELECT DATALENGTH(0x)
2> go

-----------
          0

(1 rows affected)

所以看起来从表中提取某些东西的某种“最小”是一个零字节?

我遇到的问题是,我们没有一个非常基本的put / get法则“你输入的是你得到的东西”。如果有人使用我的ODBC绑定并插入空数据,他们将不会返回空数据。这已破了。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

简单明了BINARY就像CHAR(1)一样。您需要使用VARBINARY

来自 binary and varbinary

  

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

  

varbinary [(n | max)] 可变长度二进制数据。 n可以是1到8,000之间的值。 max表示最大存储大小为2 ^ 31-1个字节。存储大小是输入数据的实际长度+ 2个字节。 输入的数据长度可以是0个字节。 varbinary的ANSI SQL同义词是二进制变量。

CREATE TABLE demo (bar VARBINARY(size));
INSERT INTO demo VALUES (0x);
SELECT DATALENGTH(bar), * FROM demo;

--length    bar
-- 0        0x

<强> DBFiddle Demo