将MSSQL字符串转换为Hex并取消在MySQL中取消该值

时间:2013-08-26 14:45:27

标签: mysql sql sql-server

我想将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之间变换:

- 与以前相同的程序,只是尝试了另一个字符串: -

enter image description here

enter image description here

MSSQL-String: 0x53414D31302F32303130E4F6FCDF5C2A23E92D656E64657C3C6469762073
MySQL-String:   53414D31302F32303130C3A4C3B6C3BCC39F2A23C3A92D656E

开头是相同的(也许是因为SAM),但它似乎是特殊字符的问题......: - (

2 个答案:

答案 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)