| Bug #47901 | Missing default value warning issued on TEXT fields on INSERT | ||
|---|---|---|---|
| Submitted: | 7 Oct 2009 18:03 | Modified: | 8 Oct 2009 13:25 |
| Reporter: | Marcus Bointon | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: Errors | Severity: | S3 (Non-critical) |
| Version: | 5.0.86, 5.1.40 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
[7 Oct 2009 18:03]
Marcus Bointon
[7 Oct 2009 19:23]
Peter Laursen
In my understanding it depends on SQL_mode. Consider a table with columns a,b and c (where c does no have a default and is NOT NULL) and you INSERT .. (a,b) VALUES ... in *non-strict* mode you will get a warning - in *strict* mode you will get an error. This is not specific for TEXT/BLOBs. Same would happen with any datatype. If 1) there is no default 2) NOT NULL prevents insertion of NULL 3) strict mode prevents 'silent insertion' or ZERO/empty string. .. there is no solution for the server. Nothing is allowed. An *error* will be returned. However in *non-strict* mode 'silent insertion' or ZERO/empty string will happen (with a warning). However for TEXT/BLOB some inconsistency is there with '' (empty string): http://bugs.mysql.com/bug.php?id=47705
[7 Oct 2009 19:48]
Peter Laursen
.. but I agree that the *text* of the error message is not very good for (in particular) TEXT/BLOBs. Better something like: in strict mode *error* could be: "no value was specified for a NOT NULL TEXT/BLOB column. Cannot INSERT to column" in non-strict mode *warning* could be: "no value was specified for a NOT NULL TEXT/BLOB column. An EMPTY STRING was INSERTED" .. but this is probably the 27,117th time we have discussed the quality of MySQL error/warning messages here! They sometimes look like they were generated by a random generator and dropped to Earth from a space shuttle ... :-)
[8 Oct 2009 11:42]
Marcus Bointon
Your bug report is the other end of the same illogical problem: * It's an error to try to set a default * If you don't have a default, you get an error Either way, we're screwed... For now I've worked around it by explicitly setting the fields to empty strings, but it's still a workaround. Can we not have defaults for TEXT fields?
[8 Oct 2009 13:25]
Valeriy Kravchuk
I agree 100% with this comment from Peter:
[7 Oct 21:48] Peter Laursen
This is what we have:
77-52-242-160:5.1 openxs$ bin/mysql -uroot test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.40-debug Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create table t (`a` TEXT NOT NULL, `b` TEXT NOT NULL default '');
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> show warnings\G
*************************** 1. row ***************************
Level: Warning
Code: 1101
Message: BLOB/TEXT column 'b' can't have a default value
1 row in set (0.00 sec)
mysql> show create table t\G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`a` text NOT NULL,
`b` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.01 sec)
mysql> insert into t set a = 'a';
Query OK, 1 row affected (0.00 sec)
No error and no warning, so we remembered default value for column b somewhere?
mysql> select * from t;
+---+---+
| a | b |
+---+---+
| a | |
+---+---+
1 row in set (0.00 sec)
mysql> select @@sql_mode;
+------------+
| @@sql_mode |
+------------+
| |
+------------+
1 row in set (0.00 sec)
mysql> select * from t where b = '';
+---+---+
| a | b |
+---+---+
| a | |
+---+---+
1 row in set (0.00 sec)
Now, for column a we have a warning:
mysql> insert into t set b = 'b';
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> show warnings\G
*************************** 1. row ***************************
Level: Warning
Code: 1364
Message: Field 'a' doesn't have a default value
1 row in set (0.00 sec)
mysql> select * from t;
+---+---+
| a | b |
+---+---+
| a | |
| | b |
+---+---+
2 rows in set (0.00 sec)
mysql> select * from t where b = '';
+---+---+
| a | b |
+---+---+
| a | |
+---+---+
1 row in set (0.00 sec)
mysql> select * from t where a = '';
+---+---+
| a | b |
+---+---+
| | b |
+---+---+
1 row in set (0.00 sec)
Yes, in strict mode it is all different:
mysql> set session sql_mode='STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.00 sec)
mysql> drop table t;
Query OK, 0 rows affected (0.00 sec)
mysql> create table t (`a` TEXT NOT NULL, `b` TEXT NOT NULL default '');
ERROR 1101 (42000): BLOB/TEXT column 'b' can't have a default value
mysql> create table t (`a` TEXT NOT NULL, `b` TEXT NOT NULL);
Query OK, 0 rows affected (0.06 sec)
mysql> insert into t set a = 'a';
ERROR 1364 (HY000): Field 'b' doesn't have a default value
We do need more correct/precise warning/error message texts for both strict and non-strict SQL modes.
Or, maybe even better, just let to set default values for TEXT/BLOB columns some day...
