Oracle Text не будет работать с NVARCHAR2.Что еще может быть недоступно? - PullRequest
23 голосов
/ 09 декабря 2010

Мы собираемся перенести приложение, чтобы оно поддерживало Unicode и пришлось выбирать между набором символов Unicode для всей базы данных или столбцами Unicode, хранящимися в N [VAR] CHAR2.

Мы знаем, что у нас больше не будет возможности индексировать содержимое столбцов с помощью Oracle Text, если мы выберем NVARCHAR2, потому что Oracle Text может индексировать столбцы только на основе типа CHAR.

Кроме того, вероятно ли, что при использовании возможностей Oracle возникают другие важные различия?

Кроме того, вероятно, что некоторые новые функции добавлены в более новые версии Oracle, но поддерживают только столбцы CHAR или столбцы NCHAR, но не оба?

Спасибо за ваши ответы.

Примечание после ответа Джастина:

Спасибо за ваш ответ. Я буду обсуждать ваши вопросы, относящиеся к нашему делу:

Наше приложение обычно находится отдельно в базе данных Oracle и заботится о сами данные. Другое программное обеспечение, которое подключается к базе данных, ограничено Toad, Тора или разработчик SQL.

Мы также используем SQL * Loader и SQL * Plus для взаимодействия с базой данных для основных заявления или для обновления между версиями продукта. У нас есть не слышал о какой-либо конкретной проблеме со всеми этими программами, касающимися NVARCHAR2.

Мы также не знаем, что администраторы баз данных среди наших клиентов будут хотел бы использовать другие инструменты в базе данных, которые не могут поддерживать данные о NVARCHAR2, и нас не очень волнует, могут ли их инструменты нарушить работу, в конце концов, они квалифицированы в своей работе и могут найти другие инструменты, если это необходимо.

Ваши последние два пункта более проницательны для нашего случая. Мы не используем много встроенные пакеты от Oracle, но это все еще происходит. Мы будем исследовать это проблема.

Можем ли мы ожидать снижения производительности, если наше приложение (скомпилированное в Visual C ++), использующее wchar_t для хранить UTF-16, должен ли выполнять преобразования кодирования для всех обработанных данных?

1 Ответ

32 голосов
/ 09 декабря 2010

Если у вас есть что-то близкое к выбору, используйте набор символов Unicode для всей базы данных.В общем, жизнь просто ослепительно проще.

  • Существует множество сторонних утилит и библиотек, которые просто не поддерживают столбцы NCHAR / NVARCHAR2 или не поддерживают работу со столбцами NCHAR / NVARCHAR2.приятный.Это очень раздражает, например, когда ваш новый блестящий инструмент отчетности не может отчитываться по вашим данным NVARCHAR2.
  • Для пользовательских приложений работа со столбцами NCHAR / NVARCHAR2 требует перехода через некоторые циклы, которые работают с Юникодом CHAR / VARCHAR2закодированные столбцы нет.Например, в коде JDBC вы постоянно будете вызывать метод Statement.setFormOfUse.Другие языки и структуры будут иметь другие ошибки;некоторые будут относительно хорошо документированы, а незначительные другие будут относительно неясными.
  • Многие встроенные пакеты будут принимать (или возвращать) только VARCHAR2, а не NVARCHAR2.Вы по-прежнему сможете вызывать их из-за неявного преобразования, но у вас могут возникнуть проблемы с преобразованием набора символов.
  • В целом, вы можете избежать проблем с преобразованием набора символов в базе данных и передать эти проблемы вПреимущество, когда база данных фактически отправляет или получает данные от клиента, значительно облегчает разработку приложения.Этого достаточно, чтобы отладить проблемы преобразования наборов символов, которые возникают в результате передачи по сети - выяснить, что некоторые данные были повреждены, когда хранимая процедура объединила данные из VARCHAR2 и NVARCHAR2 и сохранила результат в VARCHAR2 до того, как он был отправлен по сети, можетбыть мучительным.

Oracle разработала типы данных NCHAR / NVARCHAR2 для случаев, когда вы пытаетесь поддерживать устаревшие приложения, которые не поддерживают Unicode в той же базе данных, что и новые приложения, использующие Unicode, и для случаевгде полезно хранить некоторые данные Unicode с другой кодировкой (т. е. у вас есть большой объем японских данных, которые вы предпочитаете хранить, используя кодировку UTF-16 в NVARCHAR2, а не кодировку UTF-8).Если вы не находитесь в одной из этих двух ситуаций, и это не похоже на вас, я бы избегал NCHAR / NVARCHAR2 любой ценой.

Отвечая на ваши наблюдения

Наше приложение обычно находится в базе данных Oracle и заботится о самих данных.Другое программное обеспечение, которое подключается к базе данных, ограничено разработчиками Toad, Tora или SQL.

Что вы имеете в виду, «заботясь о самих данных»?Я надеюсь, что вы не говорите, что вы настроили свое приложение для обхода процедур преобразования наборов символов Oracle и что вы выполняете все преобразования набора символов самостоятельно.

Я также предполагаю, что вы используете некоторыесвоего рода API / библиотека для доступа к базе данных, даже если это OCI.Вы рассмотрели, какие изменения необходимо внести в свое приложение для поддержки NCHAR / NVARCHAR2 и поддерживает ли используемый вами API NCHAR / NVARCHAR2?Тот факт, что вы получаете данные Unicode в C ++, на самом деле не означает, что вам не нужно вносить (потенциально значительные) изменения для поддержки столбцов NCHAR / NVARCHAR2.

Мы также используем SQL *Loader и SQL * Plus для связи с базой данных для базовых операторов или для обновления между версиями продукта.Мы не слышали о какой-либо конкретной проблеме со всеми этими программами, касающимися NVARCHAR2.

Все эти приложения работают с NCHAR / NVARCHAR2.NCHAR / NVARCHAR2 вводят некоторые дополнительные сложности в сценарии, особенно если вы пытаетесь кодировать строковые константы, которые не могут быть представлены в наборе символов базы данных.Однако вы, конечно, можете обойти эти проблемы.

Мы также не знаем, что администраторы баз данных среди наших клиентов хотели бы использовать другие инструменты в базе данных, которые не могли бы поддерживать данные на NVARCHAR2, и мы недействительнообеспокоенный тем, могут ли их инструменты нарушить работу, в конце концов, они имеют опыт работы и могут найти другие инструменты в случае необходимости.

Хотя я уверен, что ваши клиенты могут найти альтернативные способы работы с вашими данными,если ваше приложение плохо работает со своим корпоративным инструментом отчетности, корпоративным ETL-инструментом или какими-либо настольными инструментами, с которыми им доводилось сталкиваться, вполне вероятно, что клиент будет винить ваше приложение, а не свои инструменты.Это, вероятно, не будет шоу-стопором, но нет никакой пользы в том, чтобы излишне горевать клиентов.Это может не побуждать их использовать продукт конкурента, но это не заставит их стремиться принять ваш продукт.

Можем ли мы также ожидать снижения производительности, если наше приложение (скомпилированное в Visual C ++), который использует wchar_t для хранения UTF-16, должен выполнять преобразования кодирования для всех обработанных данных?

Я не уверен, о каких "преобразованиях" вы говорите.Это может вернуться к моему первоначальному вопросу о том, утверждаете ли вы, что вы обходите уровень Oracle NLS, чтобы выполнить преобразование набора символов самостоятельно.

Суть в том, что я не вижу никаких преимуществ использования NCHAR / NVARCHAR2, учитывая то, что вы описываете.Есть много потенциальных недостатков их использования.Тем не менее, даже если вы можете устранить 99% недостатков, которые не имеют отношения к вашим конкретным потребностям, вы все равно столкнетесь с ситуацией, когда в лучшем случае это промывка между двумя подходами.Учитывая это, я бы предпочел пойти с подходом, который максимизирует гибкость в будущем, и это преобразование всей базы данных в Unicode (предположительно AL32UTF8) и просто использование этого.

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