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...
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.041 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.