Newsgroup: it.comp.software.database
Titolo: campi date =0000-00-00 e null sono equivalenti in mysql???

ho capito male qualcosa di sql o questo è un errore di mysql?
considera i campi date con contenuto "0000-00-00" e i campi null come equivalenti???
ma isnull(nomecampo) non deve restituire true solo se il campo è null???
guardate l'esempio se volete, ma è lunghetto:
server version: 4.1.11-Debian_4sarge3-log
mysql> SELECT count(*) FROM manodopera_ruolo WHERE inizio='0000-00-00';
+----------+
| count(*) |
+----------+
|    26514 |
+----------+
1 row in set (0.07 sec)
mysql> SELECT count(*) FROM manodopera_ruolo WHERE isnull(inizio);
+----------+
| count(*) |
+----------+
|    26514 |
+----------+
1 row in set (0.00 sec)
CREATE TABLE `manodopera_ruolo` (
... 
  `inizio` date NOT NULL default '0000-00-00',
....
);
ho provato allora a fare una tabella di test:
mysql> create temporary table test1( `id_impresa` int(11) NOT NULL default '0', nome char(2));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test1(nome) values('ciao');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into test1(nome) values('miao');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into test1(nome) values('bau');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select  * from test1;
+------------+------+
| id_impresa | nome |
+------------+------+
|          0 | ci   |
|          0 | mi   |
|          0 | ba   |
+------------+------+
3 rows in set (0.00 sec)
mysql> select  * from test1 where isnull(id_impresa);
Empty set (0.00 sec)
mysql> select  * from test1 where id_impresa=0;
+------------+------+
| id_impresa | nome |
+------------+------+
|          0 | ci   |
|          0 | mi   |
|          0 | ba   |
+------------+------+
3 rows in set (0.00 sec)
non specifico il valore di id_impresa, e fin qui tutto ok, gli 0<>null
ora provo con un campo data
mysql> alter table test1 add inizio` date NOT NULL default '0000-00-00';
    `> ;
    `> `;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' date NOT NULL default '0000-00-00';
;
`' at line 1
mysql> alter table test1 add inizio date NOT NULL default '0000-00-00';
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> select  * from test1 where inizio=0;
+------------+------+------------+
| id_impresa | nome | inizio     |
+------------+------+------------+
|          0 | ci   | 0000-00-00 |
|          0 | mi   | 0000-00-00 |
|          0 | ba   | 0000-00-00 |
+------------+------+------------+
3 rows in set (0.00 sec)
mysql> select  * from test1 where isnull(inizio);
+------------+------+------------+
| id_impresa | nome | inizio     |
+------------+------+------------+
|          0 | ci   | 0000-00-00 |
|          0 | mi   | 0000-00-00 |
|          0 | ba   | 0000-00-00 |
+------------+------+------------+
3 rows in set (0.00 sec)

 il campo è null???
Scusa, per curiosità, prova anche a inserire il 30 febbraio di un anno
qualsiasi.
Bye
-- 
Rudy
http://rdbland.blogspot.com/
e-mail a 
email.it

 
mah, sai, il fatto che non faccia il controllo sulle date fino alla versione 5.qualcosa non è importante, ma che tratti come null campi che non lo sono....
sempre che non sia un MIO problema!

 come equivalenti???
[cut]
Premetto che non sono un esperto di database. Ho fatto questo semplice
test su MySQL 4.0.25/WindowsXP
mysql> explain my_table;
+-------+--------------+------+-----+------------+-------+
| Field | Type         | Null | Key | Default    | Extra |
+-------+--------------+------+-----+------------+-------+
| Nome  | varchar(255) |      | PRI |            |       |
| data  | date         | YES  |     | 0000-00-00 |       |
+-------+--------------+------+-----+------------+-------+
2 rows in set (0.00 sec)
mysql> select * from my_table;
+----------+------------+
| Nome     | data       |
+----------+------------+
| pippo    | NULL       |
| topolino | 0000-00-00 |
| pluto    | NULL       |
| paperino | 2006-06-29 |
+----------+------------+
4 rows in set (0.02 sec)
mysql> select * from my_table where isnull(data);
+-------+------+
| Nome  | data |
+-------+------+
| pippo | NULL |
| pluto | NULL |
+-------+------+
2 rows in set (0.00 sec)
mysql> select * from my_table where data = '0000-00-00';
+----------+------------+
| Nome     | data       |
+----------+------------+
| topolino | 0000-00-00 |
+----------+------------+
1 row in set (0.00 sec)
In questo caso NULL e 0000-00-00 sono considerati diversi. Se però il
campo che contiene la data lo si definisse NOT NULL (come nel tuo
caso), allora MySQL sembrerebbe considerare 0000-00-00 equivalente a
NULL.
mysql> explain my_table;
+-------+--------------+------+-----+------------+-------+
| Field | Type         | Null | Key | Default    | Extra |
+-------+--------------+------+-----+------------+-------+
| Nome  | varchar(255) |      | PRI |            |       |
| data  | date         |      |     | 0000-00-00 |       |
+-------+--------------+------+-----+------------+-------+
2 rows in set (0.00 sec)
In questo caso i NULL vengono sostituiti con 0000-00-00.
mysql> select * from my_table;
+----------+------------+
| Nome     | data       |
+----------+------------+
| pippo    | 0000-00-00 |
| topolino | 0000-00-00 |
| pluto    | 0000-00-00 |
| paperino | 2006-06-29 |
+----------+------------+
4 rows in set (0.00 sec)
 
Dopodiché:
mysql> select * from my_table where isnull(data);
+----------+------------+
| Nome     | data       |
+----------+------------+
| pippo    | 0000-00-00 |
| topolino | 0000-00-00 |
| pluto    | 0000-00-00 |
+----------+------------+
3 rows in set (0.00 sec)
Questo sembrerebbe spiegare il comportamento da te evidenziato. Se sia
giusto che accada tutto ciò oppure no, sinceramente non saprei
dirtelo...
HTH
Ciao.
-- 
Federico

 NULL.
già.
ottima osservazione.
cmq secondo me è un errore, ma attendo lumi dai db master!