Как правильно прочитать символ UTF-8 во внешней таблице

#sql #oracle #utf-8 #character-encoding #external-tables

#sql #Oracle #utf-8 #кодировка символов #external-tables

Вопрос:

У меня есть CSV-файл, закодированный в uft8. В поле записи есть текст

В тексте есть символы, которые кодируются двумя символами. например, в слове Österreich символ Ö кодируется как O и ¨ , а не как Ö

Если я открою файл в редакторе, то увижу правильное слово Österreich ,

введите описание изображения здесь

если я посмотрю на файл, выбрав внешнюю таблицу, то я увижу O¨sterreich .

При создании внешней таблицы я уже добавил параметр ACCESS CHARACTERSET AL32UTF8

 ACCESS PARAMETERS (
 RECORDS DELIMITED BY NEWLINE 
 CHARACTERSET AL32UTF8 
 STRING SIZES ARE IN BYTES  
 skip 1
 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LDRTRIM 
 MISSING FIELD VALUES ARE NULL   
)
  

Есть ли возможность или параметр, указывающий oracle объединить два символа в выходных данных в один?

Комментарии:

1. В соответствии со стандартом Unicode вы всегда должны использовать как можно более короткую кодовую точку, т.Е. Ö ( U 00D6 ) вместо ( U 004F U 0308 ). Что вы получаете при запуске SELECT DUMP(..., 1016) FROM ... ? Убедитесь, что у вас есть символ, U 0308 COMBINING DIAERESIS а не U 00A8 DIAERESIS . Скорее всего, ваше клиентское приложение просто не отображает его должным образом. У многих клиентов возникают трудности с отображением комбинированных символов Юникода.

2. @WernfriedDomscheit, результатом запроса является Typ=1 Len=11 CharacterSet=WE8MSWIN1252: 4f,a8,73,74,65,72,72,65,69,63,68

3. как я могу это обеспечить (U 0308, ОБЪЕДИНЯЮЩИЙ DIAERESIS)?

4. Я считываю данные из внешней таблицы в своем c# приложении и генерирую pdf. Просто попытался это сделать, и текст такой, как упоминалось ранее, O¨sterreich а не Österreich . таким образом, это не только отображаемая «проблема» моего клиента. Мы получили файл от клиента. Сейчас это не большая проблема, клиент предоставляет нам файл в другой кодировке. Интересно только, если это можно решить с помощью внешней таблицы

5. Похоже, что в вашем CSV-файле у вас действительно есть — которые на самом деле являются двумя разными одиночными символами, а не Ö . Вы должны отредактировать CSV-файл таким образом, чтобы он содержал правильное содержимое.

Ответ №1:

Похоже, что Oracle external table не может U 004F U 0308 правильно преобразовать в single Ö

Я предполагаю, что результат будет хорошим, если вы перенесете свою базу данных из WE8MSWIN1252 в AL32UTF8 (UTF-8), см. https://docs.oracle.com/database/121/NLSPG/ch11charsetmig.htm#NLSPG011

Или измените CSV-файл и замените символ U 004F U 0308 на U 00D6 , что называется нормализацией Unicode

Вы также можете ознакомиться с символами и знаками объединения