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