Mysql 意外行为INT NOT NULL默认值-1

Mysql 意外行为INT NOT NULL默认值-1,mysql,Mysql,我很少与负数打交道(个人财务除外),所以这也许就是我在这方面的知识存在差距的原因 考虑以下内容,由对SO()中另一个用户提出的问题的响应提示: 为什么? 中间答案:简而言之,如果您想确保插入默认值(当未设置sql_模式时),可以从插入中省略该列,或者显式插入默认值,即:INSERT INTO price(价格)value(默认值)

我很少与负数打交道(个人财务除外),所以这也许就是我在这方面的知识存在差距的原因

考虑以下内容,由对SO()中另一个用户提出的问题的响应提示:

为什么?

中间答案:简而言之,如果您想确保插入默认值(当未设置sql_模式时),可以从插入中省略该列,或者显式插入默认值,即:
INSERT INTO price(价格)value(默认值) 似乎:

a、 )如果为非空数字字段(非自动递增)提供空值,则默认值为零

b、 )如果不提供值(如最后一行所示),则使用给定的默认值(-1)

如果使用,结果可能会不同


当前您提供的值
NULL
,服务器尝试将此值映射到最接近的INT值。服务器未使用默认值-1,因为它将NULL作为有效值。

您使用哪个版本测试它?无法使用5.5或5.6进行验证。您的第一条insert语句对于所有3个值都失败。5.5.16,sql\u mode='',而不是strict\u all\u表。这与我对手册()的解释不符,所以Aziz和Alfabravo,你们都认为这是预期的行为?我认为这是sql_模式不严格时的预期行为。我已经阅读了该页。虽然它表明在5.0.2之前,它的行为完全符合我的预期,但我不认为这一点(5.0.2之后)是明确的,除非通过推断。我遗漏了什么吗?事实上,文档中有一个小缺口,这个特殊的案例没有解释。同样,同意阿齐兹的观点
-- Mysql Version 5.5.16
-- sql_mode = ''

DROP TABLE prices;

CREATE TABLE prices (price_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,price INT SIGNED NOT NULL DEFAULT -1);

INSERT INTO prices (price) VALUES (' '),(''),(NULL);
INSERT INTO prices (price_id) VALUES (NULL);

SELECT * FROM prices;

Expected output:
+----------+-------+
| price_id | price |
+----------+-------+
|        1 |    -1 | 
|        2 |    -1 | 
|        3 |    -1 |
|        4 |    -1 |
+----------+-------+

Actual output:
+----------+-------+
| price_id | price |
+----------+-------+
|        1 |     0 |
|        2 |     0 |
|        3 |     0 |
|        4 |    -1 |
+----------+-------+