2009-03-28 6 views
7

Как вы, ребята, обрабатываете пустые строки с помощью Oracle?Oracle пустые строки

Заявление # 1: Oracle обрабатывает пустую строку (например, '') как NULL в полях "varchar2".
Заявление # 2: У нас есть модель, которая определяет абстрактную «структуры таблицы», где для нас есть поля, которые не может быть NULL, но может быть «пустым». Эта модель работает с различными СУБД; почти везде, все просто прекрасно, но не с Oracle. Вы просто не можете вставить пустую строку в поле «не null».
Заявление № 3: в нашем случае недопустимое значение по умолчанию не допускается.

Итак, кто-нибудь будет так добр, чтобы рассказать мне - как мы можем его решить?

ответ

6

Вот почему я никогда не понимал, почему Oracle так популярен. Они фактически не следуют стандарту SQL, основанному на глупом решении, которое они приняли много лет назад.

Оракул 9i SQL Reference утверждает (это было там, по крайней мере, трех основных версий):

Oracle в настоящее время обрабатывает значение символа с длиной ноля как нуль. Однако в будущих выпусках это не может продолжаться, и Oracle рекомендует не обрабатывать пустые строки так же, как и нули.

Но они не говорят , что вы должны сделать. Единственные путями я когда-либо найденные, чтобы обойти эту проблему либо:

  • имеет значение дозорного, которое не может произойти в ваших реальных данных для представления NULL (например, «дезоксирибонуклеиновый» для поля фамилии и надеюсь, что звезды кино не начинают давать своим детям странные фамилии, а также странные имена :-).
  • имеют отдельное поле, указывающее, действительно ли первое поле является действительным или нет, в основном, что делает реальная база данных с помощью NULL.
+1

«основано на глупом решении, которое они приняли много лет назад». Да, поскольку обратная совместимость - это никогда не проблема. Oracle может безопасно изменять поведение пустых строк, не нарушая при этом ловушки кода, которые полагаются на это поведение. - – NullUserException

+0

@Null, есть несколько способов исправить это, не нарушая совместимость. Один вскочил в мою голову в течение секунды, прочитав ваш комментарий, что позволяет установить флаг для определенного кода, который будет запускать его в режиме «соответствия».Таким образом, если вы явно не устанавливаете флаг для всего вашего кода, у вас есть идеальная совместимость. Если вы хотите, чтобы определенный код правильно обрабатывал NULL, установите для него флаг. Как только вы убедитесь, что у вас больше нет кода мусора, установите флаг по всему миру. Эти биты «kludge» были, по крайней мере, со времен Data General :-) – paxdiablo

+0

Это было бы похоже на «ANSI NULLS» SQL Server (например: 'SET ANSI NULLS ON'), но с другой поведением в среде по-разному может быть источник большой путаницы. – NullUserException

2

Можем ли мы сказать «Не поддерживать Oracle до тех пор, пока она не поддерживает стандартное поведение SQL»? По-видимому, это наименее болезненный путь во многих отношениях.

Если вы не можете заставить (использовать) один пробел или, возможно, Unicode Zero Width Non-Break Space (U + FEFF), то вам, вероятно, придется пройти весь свиньи и использовать что-то неправдоподобное, например 32 Z чтобы указать, что данные должны быть пустыми, но не потому, что используемая СУБД является Orrible.

1

Пустая строка и NULL в Oracle - это то же самое. Вы хотите разрешить пустые строки, но запретить NULL.

Вы наложили ограничение NULL на таблицу, что совпадает с ограничением не-пустой строки. Если вы устраните это ограничение, что вы теряете?

+0

Определение модели Sharp не более того. – Vugluskr

 Смежные вопросы

  • Нет связанных вопросов^_^