Oracle рассматривает пустую строку как проблему NULL для программиста Java / JPA - PullRequest
11 голосов
/ 01 апреля 2011

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

Я бы хотел, чтобы она сохранялась как пустая строка, поскольку она не равна NULL, так как запрос будет проще.

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

select * from mytable where myfield like '%';

если бы я хотел выбрать также нулевые значения (которые должны быть изначально пустой строкой), я должен был бы выбрать так:

select * from mytable where myfield like '%' or myfield is null;

Я хотел бы пропустить выполнение or myfield is null все время позже в моих SQL-заявлениях

Текущее решение, которое я имею в виду, заключается в том, чтобы позаботиться об этом на уровне приложений, например, в объекте я инициализирую все значение по умолчанию для моего поля String в пробел, например:

@Entity
public class MyEntity {
  private String name = " ";

  public void setName(String name) {
    if (isEmptyString(name)) {
      name = " ";
    }
  }
  ...

}

Или, возможно, я могу использовать новый тип, все еще неизвестный мне из Oracle 11g, который может сохранять пустую строку без изменения ее нулевого значения?

Спасибо!

Ответы [ 6 ]

16 голосов
/ 01 апреля 2011

Да, так работает Oracle. Пустые строки считаются нулевыми.

Конечно, вы можете «исправить» это на уровне приложения - например, сохраняя значения " ", как вы предлагали, - но сначала подумайте, в чем именно разница с вашими значениями «пустой строки» по сравнению со значениями NULL? Почему вы должны относиться к ним по-разному? Я тоже сталкивался с этой дилеммой, но, как правило, обнаруживал, что очень мало случаев, когда мне действительно нужно различать разницу.

3 голосов
/ 20 октября 2011

Это не только выбор со специальным условием where, но и обработка Java String Objects.Если у вас есть String a = "", вы можете вызвать его метод длины и получить 0. Если у вас есть String a = null, вы получите исключение nullpointer при вызове length.Поэтому работа с oracle db заставляет вас всегда проверять, равна ли ваша строка нулю, прежде чем проверять длину: (

2 голосов
/ 01 апреля 2011

Мне рано, но не

select * from mytable where myfield like '%' or myfield is null

так же, как

select * from mytable

Итак, Oracle упрощает вашу жизнь!;)

2 голосов
/ 01 апреля 2011

Нет, нет способа рассматривать пустые строки как пустые строки.Oracle всегда обрабатывает строку нулевой длины как значение NULL.

2 голосов
/ 01 апреля 2011

попробуй

create index idx_myfield on mytable(nvl(myfield,-1));

select * from mytable where nvl(myfield,-1)=-1;
0 голосов
/ 07 июня 2013

Beleive Oracle оптимизирует базу данных, преобразовав пустую строку в NULL. Во-первых, пустая строка все еще может нуждаться в явном хранении в хранилище базы данных на уровне блока данных (* 1). Хранение как NULL может уменьшить объем занимаемой памяти. Во-вторых, если в столбце были определены какие-либо индексы, то значения NULL не включаются в индекс, тем самым уменьшая объем хранилища индекса. (* 2)

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

Добавление кода на уровне структуры (или родительского класса), как предложено выше, избавит от необходимости печатать его на всех дочерних классах и объектах - это то, к чему стремится объектно-ориентированное и даже базовое программирование.

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

Я был бы рад, что Oracle оптимизирует его для меня под прикрытием.

Все об Oracle NULL:

NULL - это специальное значение. NULL не равняется чему-либо, включая самого себя, т. Е. NULL не равно NULL

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