在MySQL兼容模式下,h2不强制执行NOT NULL

时间:2013-11-16 00:41:55

标签: h2

在MySQL兼容模式下,以下SQL成功并返回0:

CREATE TABLE test2 (i INTEGER NOT NULL);
INSERT INTO test2 VALUES (NULL);
SELECT * FROM test2;

在默认模式下,它按预期失败。 MySQL 5.5 / InnoDB也失败了。 “MySQL兼容性”实际上是否意味着“MyISAM兼容性”?

2 个答案:

答案 0 :(得分:9)

此问题是由于MySQL处理空值和h2的方式。基本上MySQL会将收到的空值转换为empty string/0,而在h2中,所有三种类型之间都有明显的区别。

因此,他们(h2)决定在MYSQL模式下将空值转换为0 /空字符串/当前时间戳。但由于每个核心的h2 0 /空字符串不是空值,因此它会插入数据。

使用org.h2.engine.Mode并修改与此相关的变量:

Mode mode = Mode.getInstance("MYSQL");
mode.convertInsertNullToZero = false;

这对我有用。感谢this链接。

答案 1 :(得分:4)

来自H2: MySQL Compatibility Mode

  

插入数据时,如果列被定义为NOT NULL并且插入了NULL,则使用0(或空字符串,或时间戳列的当前时间戳)值。通常,不允许此操作并抛出异常。

MySQL手册中提到了以下关于INSERT的内容,MyISAM或InnoDB没有区别:

  

将NULL插入已声明为NOT NULL的列中。对于多行INSERT语句[..],该列设置为列数据类型的隐式默认值。 [..](对于单行INSERT,当NULL插入NOT NULL列时不会发出警告。相反,语句失败并显示错误。

因此,我不确定为什么,或者从哪个方向,这个选择是由H2做出的。