我正在写一个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绑定并插入空数据,他们将不会返回空数据。这已破了。
我错过了什么?
答案 0 :(得分:1)
简单明了BINARY
就像CHAR(1)
一样。您需要使用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 强>