将存储为VARCHAR的BINARY转换为BINARY
技术问答
287 人阅读
|
0 人回复
|
2023-09-14
|
我INSERT SELECT从表(源)中操作,每列都是VARCHAR数据类型。: U6 j. Q `& p
列之一存储二进制数据,如
% O* ^6 f. Y: N: d5 t, w'0003f80075177fe6'我插入目标表的列有相同的列,但数据类型是BINARY(16)。+ p% P9 q& |+ {( o
INSERT INTO destination( column1, --type of BINARY(16) ...)SELECT CONVERT(BINARY(16),[varchar_column_storing_binary_data]), --'0003f80075177fe6'FROM sourceGO当我插入它时,然后选择目标表,我从该BINARY在16列中得到不同的值:
' z5 P. D c, h+ @0x30303033663830303735313737666536它看起来似乎并不真正具有相同的价值。
9 ^+ k2 w- t4 u( E转换为二进制数据存储的正确方法是什么?VARCHAR,以BINARY列?
7 p% ?" P7 }5 z% H 5 s, C" ?5 I! m( T) J
解决方案: ) z3 p# ~) ^$ S& v0 s
因为字符串0003,你得到f80075177fe6”(一个VARCHAR值)被转换为代码点,这些代码点被用作二进制值。因为你可能在使用它ASCII因此,您将获得兼容的分类ASCII码点:048(306进制),f102(666进制),以此类推。这解释了3030 30 33 6 38 30 30 30 30...8 d6 U5 x& ]4 L4 t1 U# D
要把字符串分析成字节(00 03 f8 00 75 71 77 fe66)十六进制表示形式。CONVERT接受额外的样式参数,允许您转换16进制字符串:- @8 i' Q1 u* Z" D8 A6 m u
SELECT CONVERT(BINARY(16),'0003f80075177fe6',2)样式2将十六进制字符串转换为二进制。(样式1为 00x在这种情况下,开头字符串的作用是一样的。% z. X+ ?2 n% | v. d( [: J
请注意,如果字节少于16个(在这种情况下),该值将为零(0)x0003F80075177FE右填充6000000000000)。如需填充左侧,必须自行执行以下操作:2 Y d* `' y& S
SELECT CONVERT(BINARY(16),RIGHT(REPLICATE f80075177fe6',32),2)最后,请注意,二进制文转换就可以指定二进制文字,只需在前面加 00x”并且不使用引号即可:SELECT0x0003f80075177fe6它将返回type列BINARY(8)。与查询无关,只是为了完整性。 |
|
|
|
|
|