我想将Microsoft SQL中的字符串转换为十六进制值,例如:
declare @b varbinary(max)
set @b = (Select cast('Ali' as varbinary))
select cast(@b as varchar(max))
select @b
它返回:
太好了!但是我知道我想解析MySQL中的确切字符串:
所以在MySQL中,字符串看起来与我从MSSQL获得的字符串略有不同。也许我可以做一个字符串替换或什么
但是使用更复杂的字符串,它甚至会在mssql和mysql之间变换:
- 与以前相同的程序,只是尝试了另一个字符串: -
MSSQL-String: 0x53414D31302F32303130E4F6FCDF5C2A23E92D656E64657C3C6469762073
MySQL-String: 53414D31302F32303130C3A4C3B6C3BCC39F2A23C3A92D656E
开头是相同的(也许是因为SAM),但它似乎是特殊字符的问题......: - (
答案 0 :(得分:7)
SQL Server和MySQL十六进制编码在第11位开始发散。该位置的字符是ä
,第一个非ascii字符。因此,很可能有理由相信每个数据库都使用不同的编码。
MySQL编码为UTF-8
UTF-8中ä
的编码是0xC3A4
,这就是MySQL使用的。这由utf-8 decoder确认:
53414D31302F32303130C3A4C3B6C3BCC39F2A23C3A92D656E
-->
SAM10/2010äöüß*#é-en
它被切断的原因是你的MySQL客户端,它表示最后用...
切断。
SQL Server编码是Latin1_General(又名Windows-1252)
ä
的SQL Server编码为0xE4
。它可能是在SQL Server的Latin1_General
排序规则中编码的,它对应于Windows-1252。其他字符öüß
在Windows-1252下转换为0xF6FCDF
,确认猜测。
要强制SQL Server使用其他编码,请指定collate
子句:
cast('öüß' AS varchar(5)) collate French_CS_AS
由于cast(... as varbinary)
,SQL Server十六进制字符串被截断。如果未使用CAST函数指定n,则为default length is 30。尝试明确指定大小,或将其设置为max
:
cast('abcd' as varbinary(max))
^^^^^
答案 1 :(得分:1)
此查询可以解决目的:
Declare @b varbinary(max)
Select @b=Cast(CONVERT(varbinary(4), '0x' + @HexValue, 1) As varbinary)