我有一个奇怪的情况,一个字段不允许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
我在俯瞰什么?城市列如何默认为''?
答案 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