2013-08-26 32 views
6

Tôi muốn chuyển đổi một chuỗi trong Microsoft SQL để hexdecimal giá trị, ví dụ này:Chuyển đổi một MSSQL String để Hex và unhex giá trị trong MySQL

declare @b varbinary(max) 
set @b = (Select cast('Ali' as varbinary)) 

select cast(@b as varchar(max)) 
select @b 

Nó trả về:

Điều này thật tuyệt! Nhưng biết tôi muốn unhex chuỗi chính xác trong MySQL:

Vì vậy, trong MySQL chuỗi trông hơi khác so với chuỗi tôi nhận được từ MSSQL. Có lẽ tôi có thể làm một chuỗi thay thế hoặc một cái gì đó

Nhưng với một chuỗi phức tạp hơn nó thậm chí varys giữa MSSQL và mysql:

- Cùng thủ tục như trước đây, chỉ cần cố gắng một chuỗi khác: -

enter image description here

enter image description here

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

Các bắt đầu ning là như nhau (có thể vì SAM), nhưng nó có vẻ là một vấn đề với các ký tự đặc biệt ... :-(

Trả lời

6

Mã hóa SQL Server và MySQL hex bắt đầu phân kỳ ở vị trí 11. Ký tự tại vị trí đó là ä, ký tự không phải ascii đầu tiên. Vì vậy, có thể có lý do để tin rằng mỗi cơ sở dữ liệu sử dụng một mã hóa khác nhau.

Mã hóa MySQL là UTF-8

Mã hóa của ä trong UTF-8 là 0xC3A4, vì vậy đó là những gì MySQL sử dụng. Này được xác nhận bởi utf-8 decoder:

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

Lý do nó được cắt đứt là client MySQL của bạn, mà chỉ ra việc cắt giảm đầu với ... ở cuối.

Các SQL Server mã hóa là Latin1_General (aka của Windows-1252)

Server mã hóa SQL của ä0xE4. Nó có thể được mã hóa trong collation Latin1_General của SQL Server, tương ứng với Windows-1252. Các ký tự khác öüß chuyển đổi thành 0xF6FCDF trong Windows-1252, xác nhận phỏng đoán.

Buộc SQL Server để sử dụng một mã hóa khác nhau, xác định collate khoản:

cast('öüß' AS varchar(5)) collate French_CS_AS 

SQL server chuỗi hex được cắt đứt vì cast(... as varbinary) của bạn. Khi n không được chỉ định với hàm CAST, default length is 30.Cố gắng xác định kích thước một cách rõ ràng, hoặc đặt nó là max:

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

Truy vấn này có thể giải quyết các mục đích:

Declare @b varbinary(max) 
Select @b=Cast(CONVERT(varbinary(4), '0x' + @HexValue, 1) As varbinary) 
Các vấn đề liên quan