7

我想将 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),但似乎是特殊字符的问题...... :-(

4

2 回答 2

7

SQL Server 和 MySQL 十六进制编码在位置 11 处开始分歧。该位置的字符是ä,第一个非 ascii 字符。所以有可能的理由相信每个数据库使用不同的编码。

MySQL 编码为 UTF-8

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

53414D31302F32303130C3A4C3B6C3BCC39F2A23C3A92D656E
-->
SAM10/2010äöüß*#é-en

它被切断的原因是您的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

SQL Server 十六进制字符串因您的cast(... as varbinary). 当 n 未使用 CAST 函数指定时,默认长度为 30。尝试明确指定大小,或将其设置为max

cast('abcd' as varbinary(max))
                        ^^^^^
于 2013-08-26T14:50:09.467 回答
1

This query may solve the purpose:

Declare @b varbinary(max)
Select @b=Cast(CONVERT(varbinary(4), '0x' + @HexValue, 1) As varbinary)
于 2013-08-26T14:53:41.487 回答