powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вставить пустое поле как null
25 сообщений из 42, страница 1 из 2
Вставить пустое поле как null
    #33466119
Yorick.kiev.ua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос такой - как сделать ,чтоб при изменении поля пустое значение(т.е. '') воспринималось сервером как NULL ?

В более общем виде задача стоит следующая.
В 4-й версии MySQL операция с полем f1 int
Код: plaintext
update t1 set f1=''
походила нормально(для меня, правда, загадкой остается почему 8)) ). В пятом - уже нет. Ну, при смене сервера, ясное дело, полезли грабельки... 8))

Если есть еще какие-нибуть идеи как это дело обойти буду благодарен.

P.S. Общаюсь с MySQL недавно, поэтому если что - просьба ногами не бить.
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33466290
Еретик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yorick.kiev.uaВопрос такой - как сделать ,чтоб при изменении поля пустое значение(т.е. '') воспринималось сервером как NULL ?

...
Если есть еще какие-нибуть идеи как это дело обойти буду благодарен.

P.S. Общаюсь с MySQL недавно, поэтому если что - просьба ногами не бить.

Если б не твой "P.S.", думаю, уже б побили :)

Ответ: Я не знаю такого сервера СУБД, который пустую строку приравнивает NULL - это принципиально невозможно, по определению. Это не Perl и не PHP.

Надо явно присваивать NULL при вставке или апдейте, и решать это на уровне приложения, а не MySQL.

В MySQL 5+ попробуй написать триггер или сохраненку, к примеру:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TRIGGER mk_ins_NULL
BEFORE INSERT  ON tbl
FOR EACH ROW
SET NEW.fld1=IF (NEW.fld1='', NULL,NEW.fld1);

CREATE TRIGGER mk_upd_NULL
BEFORE UPDATE  ON tbl
FOR EACH ROW
SET NEW.fld1=IF (NEW.fld1='', NULL,NEW.fld1);

Или как-то еще ...

Только вопрос - это действительно надо?

не зря NULL<>'' в базе. Последствия от такой замены могут быть непредсказуемы... Например, тот, кто будет разбираться с твоим кодом, будет долго париться, откуда берутся NULL в базе...

Советую хорошо подумать, надо ли оно...
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33466315
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yorick.kiev.ua , апдейт написан неправильно. Низачот.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33466335
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕретикЯ не знаю такого сервера СУБД, который пустую строку приравнивает NULL - это принципиально невозможно, по определению.
Oracle, видимо, Вы не знаете?
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33466641
Еретик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft ЕретикЯ не знаю такого сервера СУБД, который пустую строку приравнивает NULL - это принципиально невозможно, по определению.
Oracle, видимо, Вы не знаете?


miksoft, то есть в Oracle NULL и пустая строка - одно и то же?

Пример в студию, пожалуйста.
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33466691
Фотография Dinky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yorick.kiev.ua
В 4-й версии MySQL операция с полем f1 int
update t1 set f1=''
походила нормально(для меня, правда, загадкой остается почему 8)) ).
Позволю усомниться:
MySQL 4.0.18:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
root:test> desc ntest;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| f1    | int( 11 )    | YES  |     | NULL    |       |
| f2    | varchar( 5 ) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
 2  rows in set ( 0 . 00  sec)

root:test> insert into ntest set f1='', f2='';
Query OK,  1  row affected ( 0 . 00  sec)

root:test> select * from ntest;
+------+------+
| f1   | f2   |
+------+------+
|     0  |      |
+------+------+
 1  row in set ( 0 . 00  sec)

root:test> update ntest set f1='', f2='';
Query OK,  0  rows affected ( 0 . 00  sec)
Rows matched:  1   Changed:  0   Warnings:  1 

root:test> select * from ntest;
+------+------+
| f1   | f2   |
+------+------+
|     0  |      |
+------+------+
 1  row in set ( 0 . 00  sec)
Никаких нулов, однако ;)

Правильное решение для сабжа - пройдитесь grep-ом по коду и исправьте '' на DEFAULT, в 5м это работает и для UPDATE.
--
Dmitry
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33467330
Yorick.kiev.ua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еретик
Если б не твой "P.S.", думаю, уже б побили :)

Ответ: Я не знаю такого сервера СУБД, который пустую строку приравнивает NULL - это принципиально невозможно, по определению


Чему равен null - вопрос, вообще говоря, философский.
В ms msql, к примеру, равен ли один null другому определяется отдельной командой.

В MySQL 5+ попробуй написать триггер или сохраненку, к примеру:
[/quot]

Триггер, разумеется, не пройдет, т.к. типы проверяются до insert.
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33467350
Yorick.kiev.ua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DinkyПозволю усомниться:
MySQL 4.0.18:
Dmitry

В чем, прошу прощения? Вы же сами показали, что запрос выполняется и идет вставка "0". Это меня тоже устроит.

Править код - это на крайний случай. Очень трудоемко - запросы-то формируются динамически, да и все равно что-то где-то упустишь.
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33467399
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отключите strict mode у пятого MySQL.
ЗЫ. А вообще, думать надо было, когда недокументированные особенности использовали.
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33467608
Фотография Dinky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yorick.kiev.uaЧему равен null - вопрос, вообще говоря, философский.
В ms msql, к примеру, равен ли один null другому определяется отдельной командой.

сорри, но глупости :) NULL не равен NULL - истино для любой нормальной БД ;) именно поэтому для проверки значения на NULL используется отдельная ф-ция.

--
Dmitry
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33467840
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еретик miksoft ЕретикЯ не знаю такого сервера СУБД, который пустую строку приравнивает NULL - это принципиально невозможно, по определению.
Oracle, видимо, Вы не знаете?


miksoft, то есть в Oracle NULL и пустая строка - одно и то же?

Пример в студию, пожалуйста.
если это будет достаточным примером, то вот:
Код: plaintext
1.
2.
3.
4.
SQL> select nvl2('', 1 , 2 ) from dual;

NVL2('', 1 , 2 )
------------
            2 

Oracle® Database SQL ReferenceNVL2 lets you determine the value returned by a query based on whether a specified expression is null or not null. If expr1 is not null, then NVL2 returns expr2. If expr1 is null, then NVL2 returns expr3.
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33467853
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еретикmiksoft, то есть в Oracle NULL и пустая строка - одно и то же?

Пример в студию, пожалуйста.Да пожалуйста:
Тынц №1 - Обсос того, что в Oracle пустая строка есть ничто иное как NULL
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33468354
Yorick.kiev.ua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dinky
сорри, но глупости :) NULL не равен NULL - истино для любой нормальной БД ;)

Это глупости только в Вашем представлении. И так же, очевидно, ни ms sql, ни Oracle не есть "нормальными" БД.

Кстати, в Оракле, если не ошибаюсь, есть еще и логические операции с NULL. К примеру логическое "и" с нулом даст вовсе не NULL(что было бы логично).

Dinky
именно поэтому для проверки значения на NULL используется отдельная ф-ция.


Угу. например "=". 8))
"When ANSI_NULLS is OFF, comparisons such as ColumnA = NULL return TRUE when ColumnA contains a null value and FALSE when ColumnA contains some value besides NULL". BOL
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33468430
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yorick.kiev.ua Dinky
сорри, но глупости :) NULL не равен NULL - истино для любой нормальной БД ;)

Это глупости только в Вашем представлении. И так же, очевидно, ни ms sql, ни Oracle не есть "нормальными" БД.


Эти глупости прописаны в стандарте sql. И кстати насчет sql server - читайте про set ansi_nulls, а для оракла NULL не равен NULL. В оракле трехзначная логика и NULL = NULL дает UNKNOWN
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33468433
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yorick.kiev.ua

Угу. например "=". 8))
"When ANSI_NULLS is OFF, comparisons such as ColumnA = NULL return TRUE when ColumnA contains a null value and FALSE when ColumnA contains some value besides NULL". BOL

Вы путаете стандарт и реализацию. ак по вашему, что означает ansi_nulls? Вообще то это значит режим когда NULL трактуются по ANSI стандарту. А расширений над стандартом в любой dbms хватает. Только аргументом это быть не может.
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33468993
Yorick.kiev.ua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох, вот за что я люблю наших людей...

Вроде и проблему описал четко и все понятно, ан нет, начались рассуждения о том, "как оно должно быть" и как это "должно быть" соответствует стандартам...
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33469526
Фотография Dinky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ничего себе "четко" - Вы сказали что Вам надо NULL в поле, когда вставляется пустая строка, и это работало в 4й версии. Оказалось:
1) не работало
2) NULL не надо
так к кому претензии? ;)

--
Dmitry
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33469537
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О как. А что надо? Я что-то утерял нить дискуссии...
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33469548
Фотография Dinky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2227381:
Yorick.kiev.uaВы же сами показали, что запрос выполняется и идет вставка "0". Это меня тоже устроит.

И ответ, собственно, уже прозвучал:
DocAlОтключите strict mode у пятого MySQL
;)

--
Dmitry
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33469556
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то похоже я в лужу сел)
Никого не забрызгало, надеюсь?)
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33471399
Еретик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
Операции сравнения в MySQL выполняются по следующим правилам: 

Если один или оба аргумента - NULL, то и результат сравнения будет NULL. 
Справедливо для всех операторов кроме <=>. 

Тынц
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33471949
u4x96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так это работает в Oracle:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
SQL> CREATE TABLE "TEST" (
   2     "ID" NUMERIC NOT NULL PRIMARY KEY,
   3     "NAME" VARCHAR2( 10 )
   4   )
   5   /

Tabelle wurde erstellt.

SQL> COMMIT
   2   /

Transaktion mit COMMIT abgeschlossen.

SQL> INSERT INTO "TEST" VALUES ( 1 , 'bla')
   2   /

 1  Zeile wurde erstellt.

SQL> INSERT INTO "TEST" VALUES ( 2 , '')
   2   /

 1  Zeile wurde erstellt.

SQL> INSERT INTO "TEST" VALUES ( 3 , NULL)
   2   /

 1  Zeile wurde erstellt.

SQL> SELECT * FROM "TEST" WHERE "NAME" IS NULL
   2   /

        ID NAME
---------- ----------
          2 
          3 

SQL> SELECT * FROM "TEST" WHERE "NAME" IS NOT NULL
   2   /

        ID NAME
---------- ----------
          1  bla

SQL> SELECT * FROM "TEST" WHERE "NAME"=NULL
   2   /

Es wurden keine Zeilen ausgewõhlt
:) Строк не было выбрано.

SQL> DROP TABLE "TEST"
   2   /

Tabelle wurde gelöscht.

В MS-SQL можно настраивать опции

В MySQL и PHP работа с NULL реализована через задние место, как и многое другое.
Лудше NULL вобще не использоват, а использовать пустые строки и 0.
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33471955
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
u4x96
В MySQL и PHP работа с NULL реализована через задние место, как и многое другое.
Лудше NULL вобще не использоват, а использовать пустые строки и 0.
Достаточно спорное высказывание. Вы можете подтвердить его аргументами?
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33472082
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
u4x96Вот так это работает в Oracle:
В MS-SQL можно настраивать опции
........
В MySQL и PHP работа с NULL реализована через задние место, как и многое другое.
Лудше NULL вобще не использоват, а использовать пустые строки и 0.

Опять двадцать пять! Есть стандарт, который описывает, какое именно должно быть поведение NULL. Если кто-то его не придерживается (типа оракла), это конечно удобно в некоторых случаях, но это как раз и есть "через заднее место". И гордиться этим не стоит.

Ps: "лучше" пишется через "ч"
...
Рейтинг: 0 / 0
Вставить пустое поле как null
    #33472122
u4x96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стандарт гласит любая простая функция с NULL дает NULL в том чилсле NULL=NULL что в конечном условии равнозначо FALSE(хотя там свои тараканы, читайте "троичная логика"), есть специализированые функции вроде IsNull() которые обрабатывают NULL посвоему, агрегатные функции пропускают NULL, как бутто столбца с ним и небыло. По по поводу ('' IS NULL) стандарт не говорит ни чего. Действия Oracle и MS(с определенными настройками) полностью соответствую стандарту. А вод поведенуе MySQL различается от версии и параметров компиляции(которорые нельзя кат просто, кка у MS менять). В PHP появление NULL и вовсе приводит к значительному увеличению кода, а то и к дырам в безопасности.
...
Рейтинг: 0 / 0
25 сообщений из 42, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вставить пустое поле как null
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]