2015-06-22 3 views
1

У меня есть программа, которая получает данные через веб-службы, и некоторые из данных, похоже, являются проблемой формата.Обработка ¿в Oracle

Например, я получаю данные типа «XYZ ¿ABC».

Проблема в том, что длина данных, которую я ожидаю получить, определяется как VARCHAR2 (9 BYTE).

В моей программе Java я вижу, что длина данных равна 9, но как-то при попытке вставить данные на стороне Oracle, я получаю ошибку несоответствия длины поля (где Oracle обрабатывает ее как 10.

я изменил свою программу для чтения данных в формате ANSI, как хорошо, но проблема все еще существует.

Пожалуйста посоветуйте если есть какие-то изменения я должен сделать в моей программе, чтобы справиться с этим (одна из идеи заключается в используйте подстроку на стороне Oracle и ограничьте переданные данные данными до 9 байтов, но я не хочу этого делать, поскольку в этом случае я могу потерять некоторые данные).

С уважением.

+0

'¿' обычно указывает на проблему преобразования набора символов. Какую правильную строку вы пытаетесь обработать? Каков набор символов в вашей базе данных Oracle? – sstan

+1

Длина этих данных составляет 9 символов, но количество байтов зависит от кодировки. В UTF-8 это 10 байт. Вы должны решить, хотите ли вы изменить определение поля или дезинформировать данные перед вставкой. – RealSkeptic

+0

'¿' является владельцем места для символа, который не может быть сохранен в вашей базе данных или ваш клиент не может хранить. Каков набор символов для вас и что вы ожидаете от вывода? –

ответ

1

В то время как «XYZ ¿ABC» - это 9 символов, это не 9 байт. Это связано с тем, что ¿является mutli-байтовым символом в UTF-8.

Oracle имеет two solutions для включения юникода в базе данных, но было бы слишком долго, чтобы опубликовать все это как ответ здесь.

+0

No '¿' означает любой символ« не отображаемый ». Во многих случаях это будет многобайтовый символ, но это не обязательно. –

1

Есть две вещи, которые могут произойти. Одним из них является сжатие с потерями. В этом случае вы сохраняете плохой символ в базе данных, и нет возможности «форматировать» назад, потому что все эти символы неправильно сведены к одному и тому же коду. В этом случае вы можете увидеть исходные коды данные сохранены как, с:

select DUMP('your string') from dual 

Второй случай, есть только несоответствие между наборами символов.

Для обеих проблем вам необходимо убедиться, что все данные, которые вы проходите, закодированы в одной кодировке. UTF-8 является широко поддерживаемым. ASCII лучше всего, если у вас нет символов, отличных от США.

Вещи, чтобы проверить:

Что кодировка Java с помощью? Какая кодировка является оракулом, сохраняющим данные? Какие кодировки поддерживает ваш драйвер?

0

Проблема была решена путем изменения типа данных до 9 символов.

Смежные вопросы