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

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

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

P.S. Общаюсь с MySQL недавно, поэтому если что - просьба ногами не бить.
...
Рейтинг: 0 / 0
30.12.2005, 17:38:49
    #33466290
Еретик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставить пустое поле как null
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
30.12.2005, 18:20:28
    #33466315
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставить пустое поле как null
Yorick.kiev.ua , апдейт написан неправильно. Низачот.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
30.12.2005, 19:09:10
    #33466335
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставить пустое поле как null
ЕретикЯ не знаю такого сервера СУБД, который пустую строку приравнивает NULL - это принципиально невозможно, по определению.
Oracle, видимо, Вы не знаете?
...
Рейтинг: 0 / 0
31.12.2005, 19:34:18
    #33466641
Еретик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставить пустое поле как null
miksoft ЕретикЯ не знаю такого сервера СУБД, который пустую строку приравнивает NULL - это принципиально невозможно, по определению.
Oracle, видимо, Вы не знаете?


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

Пример в студию, пожалуйста.
...
Рейтинг: 0 / 0
31.12.2005, 23:50:12
    #33466691
Dinky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставить пустое поле как null
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
03.01.2006, 13:44:35
    #33467330
Yorick.kiev.ua
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставить пустое поле как null
Еретик
Если б не твой "P.S.", думаю, уже б побили :)

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


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

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

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

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

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

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

--
Dmitry
...
Рейтинг: 0 / 0
04.01.2006, 09:08:29
    #33467840
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставить пустое поле как null
Еретик 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
04.01.2006, 09:36:41
    #33467853
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставить пустое поле как null
Еретикmiksoft, то есть в Oracle NULL и пустая строка - одно и то же?

Пример в студию, пожалуйста.Да пожалуйста:
Тынц №1 - Обсос того, что в Oracle пустая строка есть ничто иное как NULL
...
Рейтинг: 0 / 0
04.01.2006, 18:15:08
    #33468354
Yorick.kiev.ua
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставить пустое поле как null
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
04.01.2006, 19:59:23
    #33468430
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставить пустое поле как null
Yorick.kiev.ua Dinky
сорри, но глупости :) NULL не равен NULL - истино для любой нормальной БД ;)

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


Эти глупости прописаны в стандарте sql. И кстати насчет sql server - читайте про set ansi_nulls, а для оракла NULL не равен NULL. В оракле трехзначная логика и NULL = NULL дает UNKNOWN
...
Рейтинг: 0 / 0
04.01.2006, 20:01:40
    #33468433
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставить пустое поле как null
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
05.01.2006, 12:41:42
    #33468993
Yorick.kiev.ua
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставить пустое поле как null
Ох, вот за что я люблю наших людей...

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

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

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

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

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

Тынц
...
Рейтинг: 0 / 0
08.01.2006, 18:02:26
    #33471949
u4x96
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставить пустое поле как null
Вот так это работает в 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
08.01.2006, 18:06:08
    #33471955
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставить пустое поле как null
u4x96
В MySQL и PHP работа с NULL реализована через задние место, как и многое другое.
Лудше NULL вобще не использоват, а использовать пустые строки и 0.
Достаточно спорное высказывание. Вы можете подтвердить его аргументами?
...
Рейтинг: 0 / 0
08.01.2006, 21:47:53
    #33472082
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставить пустое поле как null
u4x96Вот так это работает в Oracle:
В MS-SQL можно настраивать опции
........
В MySQL и PHP работа с NULL реализована через задние место, как и многое другое.
Лудше NULL вобще не использоват, а использовать пустые строки и 0.

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

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


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