相同的表和结构在其他架构上产生重载错误

Same tables and structure gives overload error on other schema

提问人:Tim 提问时间:2/10/2023 更新时间:2/10/2023 访问量:21

问:

我用smallint(6)对表进行了简单的插入。现在,在我们最新的架构中,当将超过 32767 的值插入到该字段中时,表结构会给出重载错误。

同时,在同一实例和具有相同表结构的情况下,当超过该最大限制时,插入的值将被截断为 32767。

我的问题是,什么设置或标志可能会导致这种行为?我知道有SQL模式等等,但这些都是全局设置。对于这两者,我们都有相同的环境。

是否有一些特定于用户的设置?

Mysql版本5.7.39

我试图在某处找到是否有基于用户或架构的设置。

MySQL 截断的 SQL 模式

评论


答:

0赞 Akina 2/10/2023 #1

禁用 STRICT SQL 模式

演示

create table test (id serial primary key, val smallint);
insert into test (val) select 100;
set session sql_mode = '';
insert into test (val) select 100000;
show warnings;
水平 法典 消息
警告 1264 第 1 行的列“val”的范围值超出
set session sql_mode = 'STRICT_TRANS_TABLES';
insert into test (val) select 200000;
Out of range value for column 'val' at row 1
show warnings;
水平 法典 消息
错误 1264 第 1 行的列“val”的范围值超出
select * from test;
编号 瓦尔
1 100
2 32767

小提琴

评论

0赞 Tim 2/10/2023
问题是现在我没有在任何地方设置它,而且似乎另一个架构仍在使用严格模式。DB 由 SaaS 服务使用,该服务对两种架构具有相同的连接和实践。MySQL是否记得上次sql_mode会话设置?可能是较新的模式具有较新的设置,尽管MySQL上的结构在两个模式上是相同的......因此,如果我现在转到较新的模式并设置会话sql_mode,MySQL服务器现在和将来都会记住该模式/会话上的设置吗?
0赞 Akina 2/10/2023
@Tim MySQL是否记得上次sql_mode会话设置? ???会话设置在会话中起作用,直到会话关闭。创建新会话时,全局设置将复制到会话设置。您可以在运行时更改它们。因此,打开会话,设置所需的 SQL 模式,然后在同一会话中执行查询。
0赞 Tim 2/11/2023
我确实理解这一点。但是,当我在代码上根本没有同一个数据库实例时,它怎么可能有两个不同的 sql_mode:s?但是,当SaaS系统连接到另一个模式时,它会切换到严格模式(至少我认为是这样),而当连接到旧模式时,它不会。它的行为就像每个架构都有一个保存的设置......