在MySQL兼容模式下,以下SQL成功并返回0:
CREATE TABLE test2 (i INTEGER NOT NULL);
INSERT INTO test2 VALUES (NULL);
SELECT * FROM test2;在默认模式下,它会如预期的那样失败。使用MySQL 5.5 / InnoDB时也会失败。"MySQL兼容性“真的意味着"MyISAM兼容性”吗?
发布于 2016-10-15 02:35:59
这个问题是由于MySQL处理空值和h2的方式造成的。基本上,MySQL将接收到的空值转换为empty string/0,而在h2中,所有三种类型之间都有明显的区别。
因此,他们(h2)决定在MYSQL模式下将空值转换为0/空字符串/当前时间戳。但是由于as per core h2 0/empty字符串不是nulls,所以它插入数据。
使用org.h2.engine.Mode并修改与此相关的变量:
Mode mode = Mode.getInstance("MYSQL");
mode.convertInsertNullToZero = false;这对我很有效。感谢this链接。
发布于 2013-11-16 08:50:22
来自H2: MySQL Compatibility Mode
插入数据时,如果将列定义为非NULL并且插入了NULL,则使用0(或空字符串,或时间戳列的当前时间戳)值。通常,此操作是不允许的,并且会引发异常。
MySQL手册对INSERT有以下说明,没有区分MyISAM和InnoDB:
将NULL插入到已声明为NOT NULL的列中。对于多行INSERT语句..,列被设置为列数据类型的隐式默认值。..
因此,我不确定为什么,或者从哪里,这个选择是由H2做出的。
https://stackoverflow.com/questions/20013154
复制相似问题