mysql 存储过程中的超出范围溢出处理

Posted

技术标签:

【中文标题】mysql 存储过程中的超出范围溢出处理【英文标题】:Out- of range overflow handling in mysql stored procedure 【发布时间】:2014-08-26 10:30:47 【问题描述】:

我正在使用云 SQL。我想使用存储过程来处理超出范围的溢出。

所以,我用了

SET sql_mode='STRICT_ALL_TABLES';

使用 int、decimal 和 varchar 创建示例表

CREATE TABLE t4 (ii INT, dd DECIMAL(5,2), ff VARCHAR(5));

程序 1:

DROP PROCEDURE IF EXISTS SAMPLE_SQL_MODE1;
CREATE PROCEDURE `SAMPLE_SQL_MODE1`(ii INT,dd DECIMAL(5,2),ff varchar(5))
BEGIN
    SET sql_mode='STRICT_ALL_TABLES';

    INSERT INTO t4 VALUES (ii, dd, ff);

    SELECT * FROM t4;
    SELECT @@sql_mode;
END;

call SAMPLE_SQL_MODE1(12344444444,12344.33,'Nummber FIVE');

程序 1 结果:

 select * from t4;  

 max of int , decimal(5,2) inserted.

--------   --------  -------
 ii            dd       ff
--------   --------   -------
 2147483647 999.99    Nummb
----------  -------  -------

程序 2:

DROP PROCEDURE IF EXISTS SAMPLE_SQL_MODE2;
CREATE PROCEDURE `SAMPLE_SQL_MODE2`()
BEGIN
    SET sql_mode='STRICT_ALL_TABLES';

    INSERT INTO t4 (ii, dd, ff) 
    VALUES (12344444444, 12344.33, 'Nummber FIVE');

    SELECT * FROM t4;
    SELECT @@sql_mode;
END;

call SAMPLE_SQL_MODE2();

程序2结果:

Out of range value for column 'ii' at row 1

请帮助我。如何在存储过程中使用 set sql mode= ='STRICT_ALL_TABLES'?

我正在使用我的所有程序,例如 Procedure 1,但 sql_mode 不会引发错误。

提前致谢

【问题讨论】:

【参考方案1】:

您的第一个存储过程正在接受一个整数参数。问题是对存储过程的调用 会在存储过程生效之前进行“转换”。想必,sql模式在存储过程之外并不严格。因此,当 SQL 模式生效时,参数看起来是有效的。

这里有两个选项:

    更改参数以保存更大的值,例如 BIGINTVARCHAR(255)。那么转换应该会导致失败。

    更改代码以设置严格模式调用过程之前。

【讨论】:

以上是关于mysql 存储过程中的超出范围溢出处理的主要内容,如果未能解决你的问题,请参考以下文章

错误:Postgresql 中的日期/时间字段值超出范围

防止内容在 flexbox 模态中溢出超出滚动范围

opencv图像处理,向量下标超出范围

列 Oracle 到 MySQL 的值超出范围

MySQL 错误代码:1264。第 1 行的列 'columnname' 的值超出范围

SQL []; 索引 1 超出范围。; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 索引 1 超出范围。]