簡體   English   中英

將MSSQL字符串轉換為Hex並取消在MySQL中取消該值

[英]Convert a MSSQL String to Hex and unhex the value in MySQL

我想將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),但它似乎是特殊字符的問題...... :-(

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排序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,則默認長度為30 嘗試明確指定大小,或將其設置為max

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

此查詢可以解決目的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM