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

标签 mysql stored-procedures google-cloud-sql

我正在使用云 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不会引发错误。

提前致谢

最佳答案

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

这里有两个选项:

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

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

关于mysql - mysql存储过程中超出范围的溢出处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25503608/

相关文章:

php - 为什么使用我的主键 'code_giac' 来更新我的字段?

MySQL 问题 - 使用 'string_value' 查询数据库属性对某些属性返回 0 而对其他属性返回所有行,为什么?

sql-server - sql server 删除速度因索引而大幅减慢

Mysql存储过程太慢

sql - 在 SQL Azure 中调试存储过程的方法?

python - 任务队列以 "(2062, ' 结束 Cloud SQL 套接字打开失败,错误为 : No such file or directory')"

java - MySQL连接器错误 "The server time zone value Central European Time"

mysql - Laravel Eloquent 地查询条件下来自另一个表的值的总和

servlets - GAE + JPA :java. lang.NoClassDefFoundError:无法初始化类 EMF

python - RuntimeError : OperationalError: (2003, 无法连接到 'IPaddress of the instance' 上的 MySQL 服务器