Декодирование типа данных SQL Server Varbinary в строку Java

Попытка обойти проблему Jboss Hibernate в Java, когда вы не можете обрабатывать типы данных Nvarchar SQL Server из хранимой процедуры. Я не могу преобразовать или преобразовать типы данных в varchar из-за того, что мы храним многобайтовые символы, поэтому тип данных является обязательным. Однако я могу преобразовать тип в varbinary в хранимой процедуре и декодировать в Java.

Процедура SQL Server:

Convert(varbinary, Tile)  AS Title

На стороне Java я прочитал набор результатов и поле, теперь закодированное, например

ОБНОВЛЕНО до фактической кодировки:

0x440065007300690067006E0020002600200050006C0061006E006E006900 

Я пытаюсь разобрать этот массив байтов в строку следующим образом:

            byte[] bytes = (byte[]) dataField[0]; 

            try {

                String varbinaryString = new String(bytes, "UTF-8");
                System.out.println(varbinaryString);



            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

Результат в значительной степени представляет собой предполагаемую декодированную строку из поля Заголовок, только она декодируется следующим образом:

D e s i g n  &  P l a n n i

а не прямо положить

Design & Planning Director

Может ли кто-нибудь помочь мне в дилемме с декодированием Java varbinary типа данных SQL Server?

Заранее спасибо за помощь или подсказки.


person extofer    schedule 06.03.2013    source источник
comment
Вы уверены, что текст хранится в кодировке UTF-8 в поле varbinary? Какой тип у Tile, учитывая, что вы конвертируете в него поле varbinary? 0x4761626520697320417765736F6D65 не выглядит как D e s i g n... для меня в UTF-8. Ваша первая строчная буква e находится в индексе байта 3. 0x47 — это заглавная буква G, а не заглавная D.   -  person Mark S. Rasmussen    schedule 07.03.2013
comment
Поле заголовка изначально представляет собой Nvarchar в таблице базы данных, однако спящий режим не будет отображать тип данных Nvarchar из хранимой процедуры, поэтому в хранимой процедуре я конвертирую его в Varbinary. Я публиковал двоичный пример, это фактически: 0x440065007300690067006E0020002600200050006C0061006E006E006900   -  person extofer    schedule 07.03.2013
comment
Я не знаю, как перейти от 0x440065... к 0x476162... Они просто не кажутся равными, даже после преобразования. Не могли бы вы вернуть необработанный varbinary, а затем просто проанализировать его как UCS-2/UTF-16 в Java напрямую?   -  person Mark S. Rasmussen    schedule 07.03.2013
comment
Я удалил первый образец varbinary, на самом деле это так: Convert(varbinary, Tile) AS Title кодирует это: 0x440065007300690067006E0020002600200050006C0061006E006E006900, когда Title — директор по дизайну и планированию.   -  person extofer    schedule 07.03.2013
comment
Роджер. Разве нельзя просто вытащить необработанный varbinary и преобразовать из UCS-2/UTF-16 в Java? Зачем преобразовывать в базу данных, а я до сих пор не знаю, что такое тип данных Tile - я предполагаю, что он определяется пользователем?   -  person Mark S. Rasmussen    schedule 07.03.2013
comment
Мы не можем изменить тип данных в базе данных, поскольку она содержит многобайтовые символы, поэтому тип данных Tile — NVARCHAR, а в Stored Proc я преобразовываю его в VARBINARY. Имеет смысл?   -  person extofer    schedule 07.03.2013
comment
Извините, да, имеет смысл. Не можете ли вы изменить кодировку в Java на UCS-2/UTF16, а не на UTF-8? Преобразование NVARCHAR в VARBINARY приводит не к UTF-8, а к UCS-2.   -  person Mark S. Rasmussen    schedule 07.03.2013
comment
Строка varbinaryString = новая строка (байты, UCS-2); System.out.println(varbinaryString); // Я получаю сообщение об ошибке java.io.UnsupportedEncodingException: UCS-2   -  person extofer    schedule 07.03.2013
comment
Java должна поддерживать кодировку UTF-16, которая должна быть одинаковой для всех целей и задач в этом сценарии.   -  person Mark S. Rasmussen    schedule 07.03.2013
comment
Спасибо, Марк, ты пролил свет, и я нашел решение   -  person extofer    schedule 07.03.2013


Ответы (1)


Используя Spring и JPA, я не мог сделать то, что предлагали другие, чтобы расширить класс Hibernate Sql Dialect, хотя это хорошее решение, если вы используете hibernate cfg. Я был на правильном пути, но вы должны помнить, что нельзя ограничивать varbinary унаследованной длиной navarchar, т.е. nvarchar(30).

Convert(varbinary(max), Tile)  AS Title

Это возвращает всю закодированную строку. Наконец, я пытался декодировать UTF-8, и хотя в основном это были пробы и ошибки, varbinary кодирует в UTF-16.

s = new String(bytes, "UTF-16LE");
person Community    schedule 07.03.2013