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

Ste*_*dle 7 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
Run Code Online (Sandbox Code Playgroud)

它返回:

这很棒!但是知道我想解析MySQL中的确切字符串:

所以在MySQL中,字符串看起来与我从MSSQL获得的字符串略有不同.也许我可以做一个字符串替换或其他东西

但是使用更复杂的字符串,它甚至会在mssql和mysql之间变换:

- 和以前一样的程序,只是尝试了另一个字符串: -

在此输入图像描述

在此输入图像描述

MSSQL-String: 0x53414D31302F32303130E4F6FCDF5C2A23E92D656E64657C3C6469762073
MySQL-String:   53414D31302F32303130C3A4C3B6C3BCC39F2A23C3A92D656E
Run Code Online (Sandbox Code Playgroud)

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

And*_*mar 7

SQL Server和MySQL十六进制编码在第11位开始发散.该位置的字符是ä第一个非ascii字符.因此,很可能有理由相信每个数据库使用不同的编码.

MySQL编码是UTF-8

äUTF-8 的编码是0xC3A4,所以这就是MySQL使用的.utf-8解码器证实了这一点:

53414D31302F32303130C3A4C3B6C3BCC39F2A23C3A92D656E
-->
SAM10/2010äöüß*#é-en
Run Code Online (Sandbox Code Playgroud)

它被切断的原因是你的MySQL客户端,它表示最后的切断....

SQL Server编码是Latin1_General(又名Windows-1252)

SQL Server编码ä0xE4.它可能是在SQL Server的Latin1_General排序规则中编码的,它对应于Windows-1252.其他字符öüß转换为0xF6FCDFWindows-1252,确认猜测.

要强制SQL Server使用其他编码,请指定以下collate子句:

cast('öüß' AS varchar(5)) collate French_CS_AS
Run Code Online (Sandbox Code Playgroud)

由于您的SQL Server十六进制字符串被切断cast(... as varbinary).如果未使用CAST函数指定n,则默认长度为30.尝试明确指定大小,或将其设置为max:

cast('abcd' as varbinary(max))
                        ^^^^^
Run Code Online (Sandbox Code Playgroud)