NULL默认为mysql中的空字符串?

时间:2015-07-01 17:24:40

标签: mysql sql

我有一个奇怪的情况,一个字段不允许NULL值。如果我插入一行,该字段默认为空字符串,即使mysql声称默认值为NULL。

mysql> describe user;
+---------------------------+------------------+------+-----+---------+----------------+
| Field                     | Type             | Null | Key | Default | Extra          |
+---------------------------+------------------+------+-----+---------+----------------+
| id                        | int(30)          | NO   | PRI | NULL    | auto_increment |
| username                  | varchar(45)      | NO   | UNI | NULL    |                |
| city                      | varchar(45)      | NO   |     | NULL    |                |
+---------------------------+------------------+------+-----+---------+----------------+

mysql> show triggers;
Empty set (0.00 sec)

mysql> insert into user (username) values ('just_testing');
Query OK, 1 row affected, 17 warnings (0.01 sec)

这就是我去什么的地方?! - 城市应默认为NULL,这是不允许的,但请看这里:

mysql> select username, city from user where username = 'just_testing' and city is null;
Empty set (0.00 sec)

mysql> select username, city from user where username = 'just_testing' and city='';
+--------------+------+
| username     | city |
+--------------+------+
| just_testing |      |
+--------------+------+
1 row in set (0.00 sec)

Mysql决定使用空字符串作为默认字符串,即使它不是这样,也没有任何触发器。

进一步说:

mysql> insert into user (username, city) values ('just_testing3', NULL);
ERROR 1048 (23000): Column 'city' cannot be null

我在俯瞰什么?城市列如何默认为''?

4 个答案:

答案 0 :(得分:4)

来自docs

  

如果未在严格SQL模式下运行,则任何未显式赋值的列都将设置为其默认值(显式或隐式)。例如,如果指定的列列表未指定表中的所有列,则将未命名的列设置为其默认值。第11.6节“数据类型默认值”中描述了默认值分配。另请参见第1.8.3.3节“无效数据的约束”。

further

  

对于ENUM以外的字符串类型,默认值为空字符串。对于ENUM,默认值是第一个枚举值。

答案 1 :(得分:1)

您正在创建一个不能为null的列,其默认值为NULL。更改列以允许null为这样的值:

ALTER TABLE `user`
ALTER COLUMN `city` varchar(45) DEFAULT NULL

答案 2 :(得分:1)

describe user;的输出中,NULL列显示所有三个字段的NO。这意味着该字段中不允许使用NULL值。

您可以查看表格的创建方式(如果您没有创建表格) SHOW CREATE TABLE user;

这个例子应该有用:

mysql> create table test(firstname VARCHAR(45) NOT NULL, lastname VARCHAR(45));


mysql> describe test;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| firstname | varchar(45) | NO   |     | NULL    |       |
| lastname  | varchar(45) | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+

在这种情况下,lastname的值可以为NULL,而firstname则不能,即使两者的默认值都显示为NULL。

要更改表格的格式以接受NULL值,您应该这样做:

ALTER TABLE `user`
ALTER COLUMN `city` VARCHAR(45) NULL

答案 3 :(得分:0)

创建表格时,您已指定City不能为NULL