Как добавить символ UNICODE в запрос SQL - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь в других добавить UNICODE \ u0099 в CLOB . В моем случае я сломал остатки юникодов, например (/ 0099) в моем столбце INDICATION, который, если это имеет значение, является CLOB, поэтому я хочу заменить их каждым соответствующим символом. Поэтому я использую REPLACE, чтобы найти неработающий код и заменить его на правильный.

UPDATE PRODUCT SET INDICATION = REPLACE(INDICATION, '\0099', '™');

Я не могу нигде найти в Интернете, хотя как я могу получить Unicode и использовать его в запрос. В этом случае правильный способ сделать это заменит «™». Чтобы быть более точным c мои дела: 00AD 2122 0092 0095 0097 0096 0094. Только первые два 00AD и 2122 могут быть решены с помощью UNISTR.

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

Лучший способ, который я нашел для решения этой проблемы, заключался в том, чтобы, перебирая таблицы ASCII и используя фактический символ для каждого необходимого юникода, найти каждый соответствующий символ в таблице ASCII и использовать код HEX. Если у вас есть HEX-код, вы можете использовать его в UNISTR («код»), чтобы получить соответствующий результат в SQL. В моем случае это будет:

UPDATE PRODUCT SET INDICATION = REPLACE(INDICATION, '\0099', UNISTR('\2122'));
UPDATE PRODUCT SET INDICATION = REPLACE(INDICATION, '\0092', UNISTR('\0027'));
UPDATE PRODUCT SET INDICATION = REPLACE(INDICATION, '\0095', UNISTR('\2022'));
UPDATE PRODUCT SET INDICATION = REPLACE(INDICATION, '\0097', UNISTR('\2014'));
UPDATE PRODUCT SET INDICATION = REPLACE(INDICATION, '\0096', UNISTR('\2013'));
UPDATE PRODUCT SET INDICATION = REPLACE(INDICATION, '\0094', UNISTR('\0022'));
UPDATE PRODUCT SET INDICATION = REPLACE(INDICATION, '\00AD', UNISTR('\00AD'));

Однако я не приму это как правильный ответ, потому что я не думаю, что это лучший сценарий. Я не могу согласиться с тем, что нет лучшего способа предоставить код UNICODE и получить соответствующий результат в SQL. Таким образом, я оставлю это открытым для кого-то, кто имеет соответствующий ответ в будущем.

0 голосов
/ 08 мая 2020

Поскольку я не уверен на 100%, в чем заключается настоящая проблема, позвольте мне дать исчерпывающий ответ.

В этой проблеме я вижу два аспекта. Во-первых, как идентифицировать символы, которые должны быть помещены вместо прерванной escape-последовательности Юникода. Здесь проблема в том, что нарушенные escape-последовательности не для символов Юникода. В Unicode перечисленные коды (\ 0099, et c.) - это верхние контрольные коды ISO Latin 1, скорее всего, не те, которые вы хотите. Однако, если они интерпретируются в большинстве однобайтовых кодовых страниц Windows, эти коды имеют значение, которое вы определили сами. Единственный код, который является одновременно Unicode и Windows, является \ 00AD, который является мягким дефисом (хотя у кода Windows нет начального нуля). Это упражнение по идентификации должно выполняться вручную, если только вы не знаете исходную кодировку символов, и в этом случае можно запрограммировать некоторую автоматизацию.

Второй аспект - это как ввести символ замены в инструкцию UPDATE. Здесь проблема в том, что любой оператор SQL должен быть представлен сначала в наборе символов клиента, а затем в наборе символов базы данных. Если вы введете оператор в SQL Developer, клиентский набор символов будет Unicode, и вы можете ввести любой печатный символ непосредственно в строковый литерал. Непечатные символы должны быть закодированы, и UNISTR является удобным способом сделать это. Функция CHR () - это еще одна возможность. Здесь вам необходимо указать код символа в наборе символов базы данных.

Теперь перейдем к набору символов базы данных. Когда вы храните свои данные в CLOB, все, что вы хотите сохранить, должно быть представлено в наборе символов базы данных. Следовательно, либо набор символов базы данных может представлять все соответствующие символы, и вы можете использовать их дословно в литералах, либо вы вообще не можете хранить эти символы в CLOB.

Теперь, если ваш набор символов базы данных является одним из Windows кодовые страницы, такие как WE8MSWIN1252 или EL8MSWIN1253, и вы знаете, что прерывистые escape-последовательности обозначают коды на этой кодовой странице, вы можете попробовать кодирование PL / SQL для автоматического перевода кодов. Я не нашел способа сделать это без PL / SQL, поскольку вы не можете выполнить обработку перекодирования для всех неработающих выходов в значении CLOB, используя чистое выражение SQL. Вы можете сделать это только для одного экранирования.

В PL / SQL вы должны выполнять итерации с INSTR или REGEXP_INSTR для каждого значения в поисках синтаксиса escape, извлекать текст числового кода c, преобразовать этот текст в фактический код цифры c и передать в CHR (), чтобы записать в CLOB результата. Если вы работаете с объектами CLOB произвольной длины (> 32767), вам нужно будет использовать временный объект CLOB для результата. Для более коротких CLOB гораздо проще работать с PL / SQL VARCHAR2 (32767). Тем не менее, похоже, много работы. Из-за ограниченного числа возможных нарушенных escape-последовательностей найденное вами упрощенное решение может оказаться менее трудоемким.

0 голосов
/ 06 апреля 2020

Используйте rawtohex, чтобы узнать, как oracle хранит '™' внутри базы данных

 select rawtohex('™') from dual;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...