Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> NOT NULL поля хранят пустые строки 
V
    Опции темы
azesmcar
Дата 27.11.2009, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Добрый день,

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

mysql> CREATE DATABASE mydb;
Query OK, 1 row affected (0.00 sec)

mysql> use mydb;
Database changed

mysql> CREATE TABLE mytable (field1 VARCHAR(10) NOT NULL, field2 VARCHAR(10) NOT NULL);
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO mytable (field1, field2) VALUES ('','');
Query OK, 1 row affected (0.00 sec)

mysql>


Немного поискал в гугле, нашел вот это
http://bugs.mysql.com/bug.php?id=30958
но здесь видно что это описание ошибки не в MySQL а в Connector/ODBC, хотя проблема в точности повторяет мою а для связи я использую Native MySQL client. Версия MySQL 5.0. Кто нибудь сталкивался?

PM   Вверх
Akina
Дата 27.11.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(azesmcar @  27.11.2009,  09:34 Найти цитируемый пост)
Столкнулся с такой проблемой, MySQL позволяет записывать пустые строки в NOT NULL поля.

Правильно позволяет. Пустая строка - это строка. Пусть и нулевой длины. Это тебе не Оракл (где, кстати, из-за этого возникают определённые проблемы).



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
azesmcar
Дата 27.11.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(Akina @  27.11.2009,  08:42 Найти цитируемый пост)
Правильно позволяет. Пустая строка - это строка. Пусть и нулевой длины. Это тебе не Оракл (где, кстати, из-за этого возникают определённые проблемы).

Да я как раз по ораклу смотрю, привык. Проблем у меня с этим пока не возникало, а что с этим маразмом делать? Мне нужна валидация not empty smile какая нафиг разница null или пустая строка? Валидации фактически нет. Для текста что NULL что пустая строка. Поле Login можно запросто пустым оставить, от того что там не NULL а пустая строка мне не легче.

Это сообщение отредактировал(а) azesmcar - 27.11.2009, 09:26
PM   Вверх
DimW
Дата 27.11.2009, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(Akina @  27.11.2009,  08:42 Найти цитируемый пост)
где, кстати, из-за этого возникают определённые проблемы

проблемы возникают у разработчиков которые приходят в оракл их других СУБД, впрочим как и на оборот smile

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

select * from table
 where field = 'value'
    or field is null
    or field = ''


т.е. для идентификации пустого значения потребуется писать два условия вместо одного?
коряво как то...

Добавлено @ 09:31
Цитата(azesmcar @  27.11.2009,  09:24 Найти цитируемый пост)
 а что с этим маразмом делать? 

повесить чек констрайнт field <> '' or length(field) <> 0 полагаю. 

Это сообщение отредактировал(а) DimW - 27.11.2009, 09:31
PM MAIL ICQ   Вверх
Akina
Дата 27.11.2009, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(azesmcar @  27.11.2009,  10:24 Найти цитируемый пост)
нафиг разница null или пустая строка?

Разница? огромная.
Какой тип имеет значение "Null"? а хрен его знает...
Какой тип имеет значение "пустая строка"? строка - без вариантов...
А ты говоришь - какая нафиг разница...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
azesmcar
Дата 27.11.2009, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(DimW @  27.11.2009,  09:28 Найти цитируемый пост)
проблемы возникают у разработчиков которые приходят в оракл их других СУБД, впрочим как и на оборот 

 smile 

Цитата(DimW @  27.11.2009,  09:28 Найти цитируемый пост)
повесить чек констрайнт field <> '' or length(field) <> 0 полагаю. 

Цитата(Manual)

The CHECK clause is parsed but ignored by all storage engines

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

Добавлено @ 09:39
Цитата(Akina @  27.11.2009,  09:34 Найти цитируемый пост)
Разница? огромная.
Какой тип имеет значение "Null"? а хрен его знает...
Какой тип имеет значение "пустая строка"? строка - без вариантов...
А ты говоришь - какая нафиг разница... 

какая МНЕ разница? Поле логин то все равно пустое smile

не знаю, по мне так в Оракл это намного лучше продумано.

Это сообщение отредактировал(а) azesmcar - 27.11.2009, 09:40
PM   Вверх
Akina
Дата 27.11.2009, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(DimW @  27.11.2009,  10:28 Найти цитируемый пост)
т.е. для идентификации пустого значения потребуется писать два условия вместо одного?

Нет, одно.
И ещё одно - для идентификации отсутствия значения. А если надо проверить и то, и другое - то две проверки. Либо использование функции, проверяющей значение на null и при соответствии заменяющее на нечто требуемое.
Например 
Код

where NZ(field, '') <> ''
проверит на пустую строку и null одновременно (диалектозависимо).


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DimW
Дата 27.11.2009, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(Akina @  27.11.2009,  09:34 Найти цитируемый пост)
Какой тип имеет значение "пустая строка"? строка - без вариантов...


Akina, я думаю у azesmcar, как и у меня просто возникают сомнения в полезности и удобстве этой разницы.
PM MAIL ICQ   Вверх
Akina
Дата 27.11.2009, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(azesmcar @  27.11.2009,  10:38 Найти цитируемый пост)
какая МНЕ разница? Поле логин то все равно пустое

А это ТВОЯ ошибка. Кто позволил не заполнять это поле при создании записи или изменять его в созданной ранее записи? Программер. Который обязан был написАть код проверки корректности заносимых в таблицу данных. Но не сделал этого.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
azesmcar
Дата 27.11.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(Akina @  27.11.2009,  09:42 Найти цитируемый пост)
А это ТВОЯ ошибка. Кто позволил не заполнять это поле при создании записи или изменять его в созданной ранее записи? Программер. Который обязан был написАть код проверки корректности заносимых в таблицу данных. Но не сделал этого. 

Так я и пытаюсь эту проверку написать smile

Цитата(DimW @  27.11.2009,  09:42 Найти цитируемый пост)
Akina, я думаю у azesmcar, как и у меня просто возникают сомнения в полезности и удобстве этой разницы. 

 smile 

но вернемся к теме, что делать то?
CHECK не поддерживается, NOT NULL не работает smile 
не триггеры же писать в конце концов

Это сообщение отредактировал(а) azesmcar - 27.11.2009, 09:46
PM   Вверх
Akina
Дата 27.11.2009, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(azesmcar @  27.11.2009,  10:43 Найти цитируемый пост)
что делать то?

Делать триггер на вставку и изменение, и проверять, что в таблицу не суют ни null, ни пустую строку.
И отогнать программную часть от таблиц (ибо нефиг) - создавай необходимые для работы вьюхи и работай с данными через них.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DimW
Дата 27.11.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(Akina @  27.11.2009,  09:47 Найти цитируемый пост)
Делать триггер на вставку 

я вот не пойму:
есть две таблицы, одна родительская одна подчиненная, натягиваем на одну первичный ключ который not null вставляем в туда "пустую строку", натягиваем связь от подчененной к родительской и что получается - я могу в подчиненную вставить "пустую строку". нихера себе констрейнтик!  smile 

  
PM MAIL ICQ   Вверх
azesmcar
Дата 27.11.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(Akina @  27.11.2009,  09:47 Найти цитируемый пост)
И отогнать программную часть от таблиц (ибо нефиг) - создавай необходимые для работы вьюхи и работай с данными через них. 

До этого еще добраться нужно.

Цитата(Akina @  27.11.2009,  09:47 Найти цитируемый пост)
Делать триггер на вставку и изменение, и проверять, что в таблицу не суют ни null, ни пустую строку.

А вот эта идея мне не очень нравиться, ради валидации пустой строки триггер делать, но как я понял по другому никак..Ладно, спасибо.

Тема закрыта.

PM   Вверх
Akina
Дата 27.11.2009, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Пустую строку вставить сможешь. А null не сможешь. И не понимаю, что тебе не нравится. Всё законно, соответствие есть.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DimW
Дата 27.11.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(Akina @  27.11.2009,  10:00 Найти цитируемый пост)
Всё законно, соответствие есть.

ага и "пустая строка" является идентификатором записи  smile. правильно?

PM MAIL ICQ   Вверх
Akina
Дата 27.11.2009, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



А почему нет? чем она хуже любой другой строки?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DimW
Дата 27.11.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(Akina @  27.11.2009,  10:10 Найти цитируемый пост)
А почему нет? чем она хуже любой другой строки? 


Akina, ты знаешь, наверное это из разряда - когда считали что земля плоская а потом выяснелось что нет, и в голове не умещается как с этим теперь жить...  smile 
PM MAIL ICQ   Вверх
Akina
Дата 27.11.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Ну... в общем да. 
Цитата(azesmcar @  27.11.2009,  10:58 Найти цитируемый пост)
 эта идея мне не очень нравиться, ради валидации пустой строки триггер делать, но как я понял по другому никак

Да пожалуйста! вынеси эту логику на клиента, если тебе не нравится триггер. Это, конечно, идеологически плохо, но вполне работоспособно.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
azesmcar
Дата 27.11.2009, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(Akina @  27.11.2009,  10:36 Найти цитируемый пост)
Да пожалуйста! вынеси эту логику на клиента, если тебе не нравится триггер. Это, конечно, идеологически плохо, но вполне работоспособно. 

Вынес, думаю над триггерами.

Это сообщение отредактировал(а) azesmcar - 27.11.2009, 10:40
PM   Вверх
Zloxa
Дата 27.11.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Милый вышел холиварчик smile

В бытность, когда я писал для MS, я  находил вполне естественным и понятным, что null и '' cуть разные вещи. И тому я находил применение.
Когда я переполз на ораклю, был несколько шокирован положением дел в оном. Однако теперь привык. Случай, когда имеет смысл разделять понятия null и '' теперь не могу придумать. Однако то, что length('') возвращает Null, instr('','A') возвращает null - и ныне нахожу нелогичным

ну не маразм ли?:
Код

SQL> select s,length(replace(s,'A')) from (
  2    select 'ABAB' s  from dual
  3    union all select 'AAA' from dual
  4    union all select 'BBB' from dual
  5  )
  6  ;
 
S    LENGTH(REPLACE(S,'A'))
---- ----------------------
ABAB                      2
AAA  
BBB                       3




--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 27.11.2009, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Zloxa @  27.11.2009,  12:33 Найти цитируемый пост)
Случай, когда имеет смысл разделять понятия null и '' теперь не могу придумать.

Если значение поля при создании записи не заполняется (поле отсутствуе в insert into), а впоследствии может заполняться и корректироваться (в т.ч. очищаться, но не за-null-яться - поле обязательно присутствует в update table) - наличие null свидетельствует о том, что запись с момента заведения больше не обрабатывалась.

Цитата(Zloxa @  27.11.2009,  12:33 Найти цитируемый пост)
ну не маразм ли?:

MySQL более логичен...
Код

mysql> use test
Database changed
mysql> create table test (txt text);
Query OK, 0 rows affected (0.16 sec)

mysql> insert into test (txt) values ('ABAB'),('AAAA'),('BBBB'),(null);
Query OK, 4 rows affected (0.02 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select txt,replace(txt,'A',''),length(replace(txt,'A','')) from test;
+------+---------------------+-----------------------------+
| txt  | replace(txt,'A','') | length(replace(txt,'A','')) |
+------+---------------------+-----------------------------+
| ABAB | BB                  |                           2 |
| AAAA |                     |                           0 |
| BBBB | BBBB                |                           4 |
| NULL | NULL                |                        NULL |
+------+---------------------+-----------------------------+
4 rows in set (0.00 sec)

mysql>


Это сообщение отредактировал(а) Akina - 27.11.2009, 12:04


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 27.11.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(Akina @  27.11.2009,  11:55 Найти цитируемый пост)
 наличие null свидетельствует о том

smile)
Не находишь, что это какойто натуралистический подход smile Из разряда того, что по тому, как растет мох - определить где север. Это как бы изначально предполагает что ты не знаешь где север, а следовательно не владеешь ситуацией.

В СУБД ты являешься творцом мира и создавать мох только для того чтобы потом самому же определять по его росту где север - наверное было бы не логично.

Если нам необходимо знать инфомрацию о том апдейтилась ли запись после инсерта - от чего бы не хранить дату создания и дату модификации?

Цитата(Akina @  27.11.2009,  11:55 Найти цитируемый пост)
MySQL более логичен...

И я ж о том же smile
Так маразм кажется еще чуть более крепким:
Код

SQL> select s,instr(replace(s,'A'),'A') from (
  2    select 'ABAB' s  from dual
  3    union all select 'AAA' from dual
  4    union all select 'BBB' from dual
  5  )
  6  ;
 
S    INSTR(REPLACE(S,'A'),'A')
---- -------------------------
ABAB                         0
AAA  
BBB                          0



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 27.11.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Zloxa @  27.11.2009,  13:12 Найти цитируемый пост)
Если нам необходимо знать инфомрацию о том апдейтилась ли запись после инсерта - от чего бы не хранить дату создания и дату модификации?

Да потому что мог быть апдейт части записи, не затрагивающий указанное поле. Не хранить же дату модификации для каждого поля? и создавать, а потом дёргать каждый раз историю изменений - тоже не всегда оправдано.
Хотя согласен, что варианта, когда такое различие значимо на практике, придумать сложновато. Я пока сталкивался с подобным лишь единожды - в задаче подгрузки внешнего справочника с синхронизацией локального имено так определялось, обработана ли запись, которой не нашлось соответствия в автоматическом режиме, или нет. Там для новой номенклатуры при обработки могли вставляться некоторые характеристики, а могли и не вставляться. Во втором случае вместо null как раз в поле клалась пустая строка, и оператор, осуществлявший обработку, не получал ранее просмотренные записи на повторный просмотр.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1156 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.