Хранение многобайтовых данных в BLOB для однобайтовых развертываний оракула - PullRequest
0 голосов
/ 22 ноября 2018

Исходя из требований наших клиентов, мы настраиваем наши развертывания oracle (версия - 12c) для поддержки одно- или многобайтовых данных (посредством настройки набора символов).Из соображений производительности необходимо кэшировать многобайтовые данные сторонних производителей (json).Мы обнаружили, что можем кодировать данные в UTF-8 и сохранять их (после преобразования в байты) в столбце BLOB таблицы Oracle.Это хак, который позволяет нам хранить многобайтовые данные в однобайтовых развертываниях.При таком подходе существуют определенные ограничения, такие как

  1. Данные не могут быть запрошены или обновлены с помощью кода SQL (хранимые процедуры).
  2. Операция поиска, например, для операторов LIKE, не может бытьВыполнено.
  3. Маршалинг и демаршалинг для каждой операции на прикладном уровне (java)

Если предположить, что мы идем на компромисс с этими ограничениями, есть ли другие недостатки, о которых нам следует знать?

Спасибо.

1 Ответ

0 голосов
/ 04 декабря 2018

Хорошо, я суммирую свои комментарии в правильном ответе.

У вас есть два возможных решения:

  1. сохранить их в столбцах NVARCHAR2 / NCLOB
  2. reкодировать значения JSON, чтобы использовать только символы ASCII

1.NCLOB / NVARCHAR

Символ «N» в «NVARCHAR2» обозначает «Национальный»: этот тип столбца был введен именно для хранения символов, которые не могут быть представлены в «наборе символов базы данных».".

Oracle фактически поддерживает ДВА набора символов:

  1. " Набор символов базы данных "- это тот, который используется для обычных полей varchar / char / clob и для внутренних данных-dictionary (другими словами: это набор символов, который можно использовать для именования таблиц, триггеров, столбцов и т. д.)

  2. «Национальные наборы символов»: используемый набор символовдля хранения значений NCLOB / NCHAR / NVARCHAR, которые должны использоваться для хранения «странных» символов, используемых на национальных языках.

Обычно вторым является набор символов UNICODEТаким образом, вы можете хранить там любые данные, даже в старых установках

2.кодировать значения JSON, используя только символы ASCII

Это правда, что стандарт JSON разработан с учетом UNICODE, но также верно и то, что он позволяет выражать символы как escape-последовательности с использованием десятичного представленияих кодовые точки ... и если вы сделаете это для каждого символа, имеющего кодовую точку больше 127, вы можете выразить ЛЮБОЙ объект Unicode, используя только символ ASCII.

Эта строка ASCII JSON: '{"UnicodeCharsTest": "ni \ u00f1o "} 'представляет тот же объект этого другого объекта:' {" UnicodeCharsTest ":" niño "} '.

Лично я предпочитаю этот второй подход, поскольку он позволяет мне легко обмениваться этими строками jsonтакже с системами, использующими устаревшие устаревшие протоколы, и это также позволяет мне быть уверенным, что строки json правильно считываются любым клиентом независимо от его национальных настроек (протокол клиента oracle может пытаться преобразовать строки в символ, используемый клиентом ...и это осложнение, я не хочу иметь дело сIth.Кстати: это может быть причиной проблем, с которыми вы сталкиваетесь при работе с клиентами SQL)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...