#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
) вместоO¨
(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-файле у вас действительно есть
O¨
— которые на самом деле являются двумя разными одиночными символами, а неÖ
. Вы должны отредактировать 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
Вы также можете ознакомиться с символами и знаками объединения