Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQL Server中真正创建零长度二进制值?_Sql Server_Tsql - Fatal编程技术网

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

Sql server 如何在SQL Server中真正创建零长度二进制值?,sql-server,tsql,Sql Server,Tsql,我正在编写一个ODBC绑定,我决定实现对binary的支持,我发现如果我插入0x,假定为“空字符串”,它将返回一个一字节的缓冲区,其中包含零。显然,这没有长度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 ----

我正在编写一个ODBC绑定,我决定实现对
binary
的支持,我发现如果我插入
0x
,假定为“空字符串”,它将返回一个一字节的缓冲区,其中包含零。显然,这没有长度
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)
所以从表中提取某些内容似乎有某种“最小值”为1个零字节

我的问题是,我们没有一个非常基本的“投入就是产出”的“投入就是产出”法则。如果有人使用我的ODBC绑定并插入空数据,他们将无法恢复空数据。这个坏了


我遗漏了什么?

要点很简单
二进制
就像
字符(1)
。您需要使用
VARBINARY

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

varbinary[(n | max)]可变长度二进制数据。n可以是1到8000之间的值。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