系统1和系统2完全相同。自从更新System 1以来,MariaDB在System 1中抛出错误(没有默认值,字符串而不是int(,这些错误以前都是警告。
没有手动更改任何设置。是否有可能在更新过程中更改的设置?我该如何检查严格的打字或任何相关内容?
系统1
- 服务器版本:10.5.15-MariaDB-0+deb11u1-Debian 11
- 协议版本:10
- 数据库客户端版本:libmysql-mysqlnd 8.0.23
- 选择@@SQL_MODE;STRICT_TRANS_TABLES、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION
系统2
- 服务器版本:10.1.48-MariaDB-0+deb9u2-Debian 9.13
- 协议版本:10
- 数据库客户端版本:libmysql-mysqlnd 8.0.13
- 选择@@SQL_MODE;NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
在系统1和系统2 上产生不同结果的上下文下方
DROP TABLE IF EXISTS `testtable`;
CREATE TABLE `testtable` (
`id` int(11) NOT NULL,
`testid` int(11) NOT NULL,
`testint` int(11) NOT NULL DEFAULT 0,
`testtext` longtext COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `testtable` (`id`, `testid`, `testint`, `testtext`) VALUES
(1, 1, 1542629089, '');
ALTER TABLE `testtable`
ADD PRIMARY KEY (`id`);
ALTER TABLE `testtable`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11;
查询1
INSERT INTO `testtable` ( `testid`,`testint` ) VALUES ("19", "0");
响应系统1
INSERT INTO `testtable` ( `testid`,`testint` ) VALUES ("19", "0");
MySQL said: Documentation
#1364 - Field 'testtext' doesn't have a default value
响应系统2
1 row inserted.
Inserted row id: 11 (Query took 0.0001 seconds.)
INSERT INTO `testtable` ( `testid`,`testint` ) VALUES ("19", "0");
[ Edit inline ] [ Edit ] [ Create PHP code ]
Warning: #1364 Field 'testtext' doesn't have a default value
查询2
INSERT INTO `testtable` ( `testid`,`testint`, `testtext` ) VALUES ("20", "", "");
响应系统1
INSERT INTO `testtable` ( `testid`,`testint`, `testtext` ) VALUES ("20", "", "");
MySQL said: Documentation
#1366 - Incorrect integer value: '' for column `wafl_client_r4apps`.`testtable`.`testint` at row 1
响应系统2
1 row inserted.
Inserted row id: 12 (Query took 0.0001 seconds.)
INSERT INTO `testtable` ( `testid`,`testint`, `testtext` ) VALUES ("20", "", "");
Warning: #1366 Incorrect integer value: '' for column 'testint' at row 1
正如文档所述,MariaDB 10.2.4除其他外还引入了STRICT_TRANS_TABLES。
STRICT_TRANS_TABLES
严格模式
具有无效或丢失数据的语句将中止并回滚,但对于非事务性存储引擎和影响多行的语句(其中无效或丢失的数据不是第一行(,MariaDB将把无效值转换为最接近的有效值,或者,如果缺少值,则插入列默认值。自MariaDB 10.2.4以来的违约。
检查您的sql_modeSELECT @@SQL_MODE;
将sql_mode更新为要保留的模式。可选全局此处
SET GLOBAL sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';