【问题标题】:Convert a MSSQL String to Hex and unhex the value in MySQL将 MSSQL 字符串转换为 Hex 并取消 MySQL 中的值
【发布时间】:2013-08-29 02:29:59
【问题描述】:

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

【问题讨论】:

    标签: mysql sql sql-server


    【解决方案1】:

    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 十六进制字符串被截断。当 n 未使用 CAST 函数指定时,default length is 30.尝试明确指定大小,或将其设置为max

    cast('abcd' as varbinary(max))
                            ^^^^^
    

    【讨论】:

      【解决方案2】:

      这个查询可以解决目的:

      Declare @b varbinary(max)
      Select @b=Cast(CONVERT(varbinary(4), '0x' + @HexValue, 1) As varbinary)
      

      【讨论】:

        猜你喜欢
        • 2017-12-07
        • 1970-01-01
        • 2016-08-28
        • 1970-01-01
        • 2016-06-04
        • 2014-09-23
        • 2020-11-13
        • 1970-01-01
        • 2021-08-22
        相关资源
        最近更新 更多