binary(16) 是最适合 128 位无符号值的列数据类型,因为 SQL Server 没有 128 位无符号类型。与char(32)相比,这将减少一半的存储和内存需求。
我应该在最短的时间内查询此列以获取以前的重复值
可能的时间(注意:这不是唯一性约束)。
在列上创建索引以避免全表扫描。
我应该插入具有低计时开销的值。
上述索引的插入性能成本很小,但会被运行时节省所抵消。
记录数可能在数千万左右(例如 90M)。
一个 100M 行的表只有几 GB(取决于行大小),如果经常使用该表,它可能会驻留在足够大小的 SQL 实例上。
我想将列值显示为十六进制。
与所有显示格式一样,这是一项最好在表示层中完成的任务,但也可以在 T-SQL 中完成。
我想使用十六进制输入字符串查询列值。
理想情况下,查询时应该匹配列数据类型,但如果需要,可以将十六进制字符串显式转换为二进制。
示例 T-SQL:
CREATE TABLE dbo.YourTable (
YourTableID int NOT NULL CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED
, BinaryValue binary(16) NOT NULL INDEX idx_BinaryValue NONCLUSTERED
, OtherData varchar(50) NOT NULL
);
INSERT INTO dbo.YourTable VALUES(1,0X000102030405060708090A0B0C0D0E0F,'example 1');
INSERT INTO dbo.YourTable VALUES(2,0X000102030405060708090A0B0C0D0E00,'example 2');
INSERT INTO dbo.YourTable VALUES(3,0X000102030405060708090A0B0C0D0E0F,'example 3 duplicate value');
--example query values
DECLARE @BinaryValue binary(16) = 0X000102030405060708090A0B0C0D0E0F;
DECLARE @CharValue char(32) = '000102030405060708090A0B0C0D0E0F';
--matching type query
SELECT YourTableID, BinaryValue, OtherData, CONVERT(char(16), BinaryValue, 2) AS DisplayValue
FROM dbo.YourTable
WHERE BinaryValue = @BinaryValue;
--query with hex string
SELECT YourTableID, BinaryValue, OtherData, CONVERT(char(16), BinaryValue, 2) AS DisplayValue
FROM dbo.YourTable
WHERE BinaryValue = CONVERT(binary(16), @CharValue, 2);
GO