2013-08-26 3 views
6

Я хочу, чтобы преобразовать строку в Microsoft SQL для hexdecimal значения, например так:Преобразование MSSQL строки в Hex и unhex значения в MySQL

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

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

Она возвращает:

Это замечательно! Но знаю, что я хочу unhex точной строки в MySQL:

Таким образом, в MySQL строка выглядит немного отличается от строки я получаю от MSSQL. Может быть, я мог бы сделать строку замены или что-то

Но с более сложной струны даже Варис между MSSQL и MySQL:

- такой же метод, как и раньше, просто попробовал другую строку: -

enter image description here

enter image description here

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

Бегина ning одинаково (возможно, из-за SAM), но, похоже, проблема с особыми символами ... :-(

ответ

6

Шестнадцатеричные кодировки SQL Server и MySQL начинают расходиться в позиции 11. Символ в эта позиция ä, первый символ не-ascii. Поэтому есть вероятная причина полагать, что каждая база данных использует другую кодировку.

Кодировка MySQL является UTF-8

Кодирование ä в UTF-8 является 0xC3A4, так это то, что использует MySQL. Это подтверждается utf-8 decoder:

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

Причина, по которой отрезан ваш клиент MySQL, что указывает на отсечной с ... в конце.

кодирование

Сервер SQL является Latin1_General (ака для Windows-1252)

Кодирование SQL Server из ä является 0xE4. Вероятно, он закодирован в сортировке SQL Server Latin1_General, что соответствует Windows-1252. Другие символы öüß конвертировать в 0xF6FCDF под Windows-1252, подтверждая предположение.

Чтобы заставить SQL Server использовать другую кодировку, указать collate пункт:

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

Шестнадцатиричный Сервер строка SQL отрезанном из-за вашего cast(... as varbinary). Когда n не указывается функцией CAST, default length is 30.Попробуйте указать размер в явном виде, или установить его max:

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

Этот запрос может решить цель:

Declare @b varbinary(max) 
Select @b=Cast(CONVERT(varbinary(4), '0x' + @HexValue, 1) As varbinary) 
Смежные вопросы