广告
返回顶部
首页 > 资讯 > 数据库 >Mysql的Procedure参数如何为NULL问题分析
  • 324
分享到

Mysql的Procedure参数如何为NULL问题分析

2024-04-02 19:04:59 324人浏览 薄情痞子
摘要

本篇文章给大家分享的是有关Mysql的Procedure参数如何为NULL问题分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 最近写过程

本篇文章给大家分享的是有关Mysql的Procedure参数如何为NULL问题分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

最近写过程时发现一个有趣的事情,mysql 的procedure 在传参的过程中,遇到一些“非法”的参数是有自己独特的处理方式。例如本来定义是int的参数,结果被传入的是null
,mysql 的procedure会正常执行。
库表结构:
    create database db5;
 
use db5;
 
drop table if exists t;
create table t(
id int primary key auto_increment,
value int
);
 
create table t2(
id int primary key auto_increment,
value float
);
创建procedure:
   delimiter //
CREATE PROCEDURE p14 (IN parameter1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = parameter1 + 1;
INSERT INTO t(value) VALUES (variable1);
END;
 //
delimiter ;
 
运行结果:
 
 
mysql> call p14(5);
Query OK, 1 row affected (0.02 sec)
 
mysql> select * from t;
+----+-------+
| id | value |
+----+-------+
| 2 |     6 |
+----+-------+
1 row in set (0.00 sec)
 
mysql> call p14(null);
Query OK, 1 row affected (0.04 sec)
 
mysql> select * from t;
+----+-------+
| id | value |
+----+-------+
| 2 |     6 |
| 3 | NULL |
+----+-------+
2 rows in set (0.00 sec)
 
 
大家注意到没有,当参数parameter1传入等于5时,表插入6,数据正常。
当参数parameter1传入为null时,表插入NULL,这是为什么呢。
 
关于这点大家可以看看声明变量的语句,文档给出了这样的解释:declare这个语句被用来声明局部变量。要给变量提供一个默认值,请包含一个DEFAULT子句。值可以被指定为一个表达式,不需要为一个常数。如果没有DEFAULT子句,初始值为NULL。
 
上面这样又有了一个新的问题:NULL=NULL+1?哈哈,有点意思了,此时的SET variable1 = parameter1 + 1;会有一个怎样合理的解释呢?
 
这是王老师给的解释(第二条很经典呀~~~):
1 null+1=null
因为null表现为“类似指针”,也就是指向“0地址的内容”,如果这个内容为“null”,则表现为null。这就是指定INT也为空的原因。但是,如果“内容”有值,则表现为不空,对于MYSQL而言,是个“随机数”或0;当这个地址内容存储时,值就固定了;
 
 
2 如果A=B+1,只有B为null时,A才为NULL;SET A=B+1,是否可理解为SET (B+1),A已经在‘当前’替换,这样A是谁不重要,重要的是B+1;
本想法没有验证,主要是分离不了SET,而mysql5的文档,有支持这一说法,但英文版本是用“替换”,不是中文的“设置”表达,感觉意思更为接近!(SET)
 
一个新的问题:当A=1/B,B=0时,也能运行成功吗?
 
mysql>
 
delimiter //
CREATE PROCEDURE p15 (IN parameter1 INT)
BEGIN
declare variable2 float(5,3);
 SET variable2 =1/ parameter1;
 INSERT INTO t2(value) VALUES (variable2);
END;
//
delimiter ;
 
执行结果:
 
mysql> call p15(0);
Query OK, 1 row affected (0.03 sec)
 
mysql> select * from t2;
+----+-------+
| id | value |
+----+-------+
| 1 | NULL |
+----+-------+
1 row in set (0.00 sec)
 
mysql> call p15(1);
Query OK, 1 row affected (0.03 sec)
 
mysql> select * from t2;
+----+-------+
| id | value |
+----+-------+
| 1 | NULL |
| 2 |     1 |
 
读者注意没有? 这个也能运行成功。其实这个问题在mysql的SQL服务器模式参数细节中可以找到。
MySQL服务器可以以不同的SQL模式来操作,并且可以为不同客户端应用不同模式。这样每个应用程序可以根据自己的需求来定制服务器的操作模式。
模式定义MySQL应支持哪些SQL语法,以及应执行哪种数据验证检查。这样可以更容易地在不同的环境中使用MySQL,并结合其它服务器使用MySQL。
你可以用--sql-mode="modes"选项启动d来设置默认SQL模式。如果你想要重设,该值还可以为空(--sql-mode ="")。
你还可以在启动后用SET [SESSioN|GLOBAL] sql_mode='modes'语句设置sql_mode变量来更改SQL模式。设置 GLOBAL变量时需要拥有SUPER权限,并且会影响从那时起连接的所有客户端的操作。设置SESSION变量只影响当前的客户端。任何客户端可以随时更改自己的会话 sql_mode值。
Modesis是用逗号(‘,’)间隔开的一系列不同的模式。你可以用SELECT @@sql_mode语句查询当前的模式。默认值是空(没有设置任何模式)。
STRICT_TRANS_TABLES
为所有存储引擎启用严格模式。非法数据值被拒绝。后面有详细说明。
· STRICT_TRANS_TABLES
事务存储引擎启用严格模式,也可能为非事务存储引擎启用严格模式。后面有详细说明。
严格模式控制MySQL如何处理非法或丢失的输入值。有几种原因可以使一个值为非法。例如,数据类型错误,不适合列,或超出范围。当新插入的行不包含某列的没有显示定义DEFAULT子句的值,则该值被丢失。
对于事务表,当启用STRICT_ALL_TABLES或STRICT_TRANS_TABLES模式时,如果语句中有非法或丢失值,则会出现错误。语句被放弃并滚动。
对于非事务表,如果插入或更新的第1行出现坏值,两种模式的行为相同。语句被放弃,表保持不变。如果语句插入或修改多行,并且坏值出现在第2或后面的行,结果取决于启用了哪个严格选项:
ERROR_FOR_DIVISION_BY_ZERO
在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作结果为NULL。
还有些其他参数,读者可以参详mysql的文档。
 
当我们给sql_mode 中加入ERROR_FOR_DIVISION_BY_ZERO参数时,重启mysql
mysql> show variables like 'sql_mode';
+---------------+---------------------------------------------------------------
----------------------------+
| Variable_name | Value
                            |
+---------------+---------------------------------------------------------------
----------------------------+
| sql_mode      | STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_
USER,NO_ENGINE_SUBSTITUTION |
+---------------+---------------------------------------------------------------
----------------------------+
1 row in set (0.00 sec)
 
mysql> select 1/0;
+------+
| 1/0 |
+------+
| NULL |
+------+
1 row in set, 1 warning (0.00 sec)
 
我们看到了1 warning,我们在看下这个warning:
mysql> show warnings;
+-------+------+---------------+
| Level | Code | Message       |
+-------+------+---------------+
| Error | 1365 | Division by 0 |
+-------+------+---------------+
1 row in set (0.00 sec)
 
mysql> exit
Bye
我们把sql_mode 中去掉ERROR_FOR_DIVISION_BY_ZERO参数时,重启mysql,试试看:
 
C:\Documents and Settings\Administrator>net stop mysql
MySQL 服务正在停止.
MySQL 服务已成功停止。
 
 
C:\Documents and Settings\Administrator>net start mysql
 
MySQL 服务已经启动成功。
 
 
mysql> select 1/0;
+------+
| 1/0 |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
 
mysql> show warnings;
Empty set (0.02 sec)
这时warnings的内容为空。
问题到这里,读者也知道这是为什么了。

以上就是Mysql的Procedure参数如何为NULL问题分析,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: Mysql的Procedure参数如何为NULL问题分析

本文链接: https://www.lsjlt.com/news/61768.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mysql的Procedure参数如何为NULL问题分析
    本篇文章给大家分享的是有关Mysql的Procedure参数如何为NULL问题分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 最近写过程...
    99+
    2022-10-18
  • MySQL复制问题的三个参数分析
        今天星期二,早上居然起晚了,上班迟到了,简直是。。。废话不多说,在昨天的文章中,我们提到了三个参数,分别是: slave_exec_mode参数; sql_slave_...
    99+
    2022-05-25
    MySQL 复制 MySQL 复制问题 MySQL 复制参数
  • 关于mybatis传入参数一直为null的问题
    目录mybatis传入参数一直为nullmybatis字段为null的解决先讲一讲sql语句和ResultMap的顺序实体类UserInfoUserMapper.xml错误代码正确写...
    99+
    2022-11-13
  • oracle11g的job_queue_processes参数问题分析
    本篇内容主要讲解“oracle11g的job_queue_processes参数问题分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“oracle11g的job...
    99+
    2022-10-19
  • 如何分析C++函数参数引用问题
    这期内容当中小编将会给大家带来有关如何分析C++函数参数引用问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在C++函数参数中,使用了引用作形参,调用时所对应的实参应该是一个数组名,这里的引用是给数组起...
    99+
    2023-06-17
  • 如果任何参数为 NULL,MySQL EXPORT_SET() 函数返回什么?
    如果 MySQL EXPORT_SET() 函数中提供的任何参数为 NULL,则该函数将返回 NULL。以下示例将演示它 -示例mysql> Select EXPORT_SET(NULL, 'Y','N'...
    99+
    2023-10-22
  • SQLSERVER参数嗅探问题的示例分析
    小编给大家分享一下SQLSERVER参数嗅探问题的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!下面测试数据库的备份文件...
    99+
    2022-10-18
  • 如何解决MySQL中NOT IN填坑之列为null的问题
    这篇文章主要介绍了如何解决MySQL中NOT IN填坑之列为null的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在公司做一个小功能的...
    99+
    2022-10-18
  • 如何进行mysql的innodb_flush_log_at_trx_commit参数分析
    这期内容当中小编将会给大家带来有关如何进行mysql的innodb_flush_log_at_trx_commit参数分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 ...
    99+
    2022-10-19
  • 如何分析MySQL数据库的Web安全问题
    本篇文章为大家展示了如何分析MySQL数据库的Web安全问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。数据安全是现在互联网安全非常重要一个环节。而且一旦数据出现...
    99+
    2022-10-19
  • 如何解析有关C++参数问题
    本篇文章为大家展示了如何解析有关C++参数问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。所谓C++参数的说明,其实是对指定应用而言,它可以是赋予的常数值,在泛指时,它可以是一种变量,用来控制随其...
    99+
    2023-06-17
  • C#中调用C类型dll入参为struct的问题分析
    这篇文章将为大家详细讲解有关C#中调用C类型dll入参为struct的问题分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言C# 可以通过 DllImport 的方式引用 C 类型的 dll。但很多 ...
    99+
    2023-06-14
  • React中onClick传递参数问题的示例分析
    这篇文章给大家分享的是有关React中onClick传递参数问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 背景说明在下图这样的列表中,点击删除按钮需要执行删除操作 列表产生:{...
    99+
    2023-06-25
  • mysql中查询字段为null的数据navicat问题怎么解决
    这篇“mysql中查询字段为null的数据navicat问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql...
    99+
    2023-07-04
  • 如果 INTERVAL() 函数的第一个参数为 NULL,MySQL 将返回什么?
    如果 INTERVAL() 函数的第一个参数为 NULL,MySQL 将返回 -1 作为输出。下面的例子将演示它 -mysql> Select INTERVAL(NULL,20,32,38,40,50,55); +----------...
    99+
    2023-10-22
  • C语言中main()函数参数问题的示例分析
    这篇文章主要介绍了C语言中main()函数参数问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。#include<stdio.h>void m...
    99+
    2023-06-29
  • Oracle 19c的参数sec_case_sensitive_logon与ORA-01017错误问题分析
    Oracle的参数sec_case_sensitive_logon是Oracle 11g开始被引入。这个参数主要是为了控制密码的大小写敏感问题。sec_case_sensitive_...
    99+
    2023-05-18
    Oracle 19c sec_case_sensitive_logon与ORA-01017 Oracle 19c  ORA-01017错误
  • Oracle 19c的参数sec_case_sensitive_logon与ORA-01017错误问题分析
    oracle的参数sec_case_sensitive_logon是Oracle 11g开始被引入。这个参数主要是为了控制密码的大小写敏感问题。sec_case_sensitive_logon=true表示密码区分大小写...
    99+
    2023-04-26
    Oracle 19c sec_case_sensitive_logon与ORA-01017 Oracle 19c ORA-01017错误
  • 如果我们提供 NULL 作为 MySQL CHAR() 函数的参数,会发生什么?
    如果 NULL 作为参数提供,MySQL CHAR() 函数将忽略 NULL。要理解它,请考虑以下示例 -mysql> Select CHAR(65,66,67,NULL); +--------------------...
    99+
    2023-10-22
  • MySQL中CONCAT()函数拼接出现NULL问题如何解决
    本文小编为大家详细介绍“MySQL中CONCAT()函数拼接出现NULL问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL中CONCAT()函数拼接出现NULL问题如何解决”文章能帮助大家解决疑惑,下面跟...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作