关于mysql:为什么MariaDBb 允许将文本插入smallint

Why does MariaDBb allow insert of text into smallint

我的服务器 vendor已将 MYSQL 替换为 MariaDB,这似乎工作方式有所不同。我在运行"SHOW GLOBAL VARIABLES LIKE '%version%';"时获得的有关此服务器的信息是:

变量名值
协议版本 10
slave_type_conversions
版本 5.5.58-MariaDB
version_comment MariaDB 服务器
version_compile_machine x86_64
version_compile_os Linux

SQL 语句"INSERT INTO years (Year) VALUES ('test');"使用 Aria 或 MyISAM 引擎将 0 插入到 smallint 字段中

在我的本地开发系统上运行"SHOW GLOBAL VARIABLES LIKE '%version%';"我得到:

变量名值
innodb_version 5.6.21
协议版本 10
slave_type_conversions
版本 5.6.21-日志
version_comment MySQL 社区服务器 (GPL)
version_compile_machine x86_64
version_compile_os Win64

同样的 SQL 语句"INSERT INTO years (Year) VALUES ('test');"使用 MISAM 引擎会产生错误代码:1366"第 1 行的列‘Year’的整数值‘test’不正确",这是我所期望和依赖的。

谁能解释为什么会这样?


让我把它放在一个正确的答案中。发生这种情况是因为两件事,一是类型转换,主要原因是 SQL 模式配置部分中的 STRICT_MODE 配置。

严格模式状态

A mode where at least one of STRICT_TRANS_TABLES or STRICT_ALL_TABLES is enabled is called strict mode. With strict mode not set (default in version <= MariaDB 10.2.3), MariaDB will automatically adjust invalid values, for example, truncating strings that are too long, or adjusting numeric values that are out of range, and produce a warning.

With strict mode set (default from MariaDB 10.2.4), the statements will fail, and an error will be returned instead. The IGNORE keyword can be used when strict mode is set to convert the error to a warning.