前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL 函数的一个小tip

MySQL 函数的一个小tip

作者头像
AsiaYe
发布于 2023-03-08 11:29:16
发布于 2023-03-08 11:29:16
50600
代码可运行
举报
文章被收录于专栏:DBA随笔DBA随笔
运行总次数:0
代码可运行

MySQL 函数的一个小tip

今天上班的时候,同事问了一个问题,关于MySQL函数的。说实话,这方面积累确实比较少,主要原因是函数和存储过程都偏向于业务逻辑,在线上环境一般不建议使用,开发人员应该尽可能将这些业务逻辑写在业务代码里面,而不是让数据库去操作。数据库应该去做它擅长的事情,例如数据的增删改查之类的。

但是,这也不是说线上环境,就不允许使用函数和存储过程,有些存量的历史业务,可能改造起来成本过高,收益和成本不成正比,所以数据库里面还是有这些数据形态存在。

01

问题介绍

这个具体的函数问题,可以拆分为以下几个:

1、如何查看MySQL函数的详细信息?

这个问题其实还好,在MySQL5.7和MySQL8.0里面,我们都可以通过information_schema.routines和information_schema.parameters来查看函数的相关信息。

其中routines表显示的是函数的创建信息;parameters表显示的是函数的参数信息。

来看下面例子:

创建一个简单的函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> create function myf1 (param1 int) returns int 
mysql> no sql  
mysql> begin 
mysql> return (select 2); 
mysql> end//
Query OK, 0 rows affected (0.02 sec)

简单解释下这个SQL吧:

param1 int代表我们的输入参数是一个整数;

returns int代表函数返回值是个整数;

no sql表示函数体不包含SQL语句;

return (select 2)是真正的函数体。

函数的创建信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select * from information_schema.routines where routine_schema='test' \G
*************************** 1. row ***************************
           SPECIFIC_NAME: myf1
         ROUTINE_CATALOG: def
          ROUTINE_SCHEMA: test
            ROUTINE_NAME: myf1
            ROUTINE_TYPE: FUNCTION
               DATA_TYPE: int
CHARACTER_MAXIMUM_LENGTH: NULL
  CHARACTER_OCTET_LENGTH: NULL
       NUMERIC_PRECISION: 10
           NUMERIC_SCALE: 0
      DATETIME_PRECISION: NULL
      CHARACTER_SET_NAME: NULL
          COLLATION_NAME: NULL
          DTD_IDENTIFIER: int
            ROUTINE_BODY: SQL
      ROUTINE_DEFINITION: begin return (select 2); end
           EXTERNAL_NAME: NULL
       EXTERNAL_LANGUAGE: SQL
         PARAMETER_STYLE: SQL
        IS_DETERMINISTIC: NO
         SQL_DATA_ACCESS: NO SQL
                SQL_PATH: NULL
           SECURITY_TYPE: DEFINER
                 CREATED: 2023-01-09 06:26:05
            LAST_ALTERED: 2023-01-09 06:26:05
                SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
         ROUTINE_COMMENT:
                 DEFINER: root@%
    CHARACTER_SET_CLIENT: utf8mb4
    COLLATION_CONNECTION: utf8mb4_0900_ai_ci
      DATABASE_COLLATION: utf8mb4_0900_ai_ci

函数的参数信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select * from information_schema.parameters where specific_schema='test'\G
*************************** 1. row ***************************
        SPECIFIC_CATALOG: def
         SPECIFIC_SCHEMA: test
           SPECIFIC_NAME: myf1
        ORDINAL_POSITION: 0
          PARAMETER_MODE: NULL
          PARAMETER_NAME: NULL
               DATA_TYPE: int
CHARACTER_MAXIMUM_LENGTH: NULL
  CHARACTER_OCTET_LENGTH: NULL
       NUMERIC_PRECISION: 10
           NUMERIC_SCALE: 0
      DATETIME_PRECISION: NULL
      CHARACTER_SET_NAME: NULL
          COLLATION_NAME: NULL
          DTD_IDENTIFIER: int
            ROUTINE_TYPE: FUNCTION
*************************** 2. row ***************************
        SPECIFIC_CATALOG: def
         SPECIFIC_SCHEMA: test
           SPECIFIC_NAME: myf1
        ORDINAL_POSITION: 1
          PARAMETER_MODE: IN
          PARAMETER_NAME: param1
               DATA_TYPE: int
CHARACTER_MAXIMUM_LENGTH: NULL
  CHARACTER_OCTET_LENGTH: NULL
       NUMERIC_PRECISION: 10
           NUMERIC_SCALE: 0
      DATETIME_PRECISION: NULL
      CHARACTER_SET_NAME: NULL
          COLLATION_NAME: NULL
          DTD_IDENTIFIER: int
            ROUTINE_TYPE: FUNCTION

注意红色的部分,就是问题所在。

第二行好理解,就是我们传入的参数param1,它的mode是IN,类型为int。

第一行包含参数名为Null的参数,它的mode也是Null,类型是int

2、为什么输入参数只有1个,单数parameter里面还有一行PARAMETER_MODE=Null,PARAMETER_NAME=Null 的记录?

这个问题当时确实比较模糊,主要是对于Null值不太清楚,查了查官方文档,找到了结果。

  • PARAMETER_MODE The mode of the parameter. This value is one of IN, OUT, or INOUT. For a stored function return value, this value is NULL.
  • PARAMETER_NAME The name of the parameter. For a stored function return value, this value is NULL.
  • DATA_TYPE The parameter data type. The DATA_TYPE value is the type name only with no other information. The DTD_IDENTIFIER value contains the type name and possibly other information such as the precision or length.

简单翻译一下:

对于PARAMETER_MODE字段,正常取值是in,out或者inout,但是对于函数返回值,这个值是NULL;我们没有定义param1参数的取值,原因在官方文档中也有体现:

Specifying a parameter as IN, OUT, or INOUT is valid only for a PROCEDURE. For a FUNCTION, parameters are always regarded as IN parameters.(对于函数,参数总是被视作in类型)

对于PARAMETER_NAME字段,正常取值是参数名字,对于函数返回值,这个值是NULL;

对于DATA_TYPE字段,这个字段只返回类型名字,而不包含其他信息,例如类型长度。也就意味着如果函数返回值是varchar(10),这个字段也会只显示varchar,而没有长度信息。长度信息需要在另外一个字段DTD_IDENTIFIER上去获取。

到这里,这个小问题就解决了。相信不长使用函数的小伙伴,肯定也有收获。

最近很少搞MySQL相关的东西,抽空水一篇,今天就到这里吧。晚安。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL如何获取存储过程参数?
前两天有个小伙伴问我如何查看MySQL存储过程的参数问题,这个问题还真把我问住了。于是查了查官方文档,把查看的结果分享出来,希望对大家有帮助吧。
AsiaYe
2022/12/07
3.7K0
MySQL information_schema详解 PARAMETERS
该表存放这存储过程和存储函数的参数信息以及存储函数的返回值,及我们一般意义上的存储过程和函数,统称为stored routines
bsbforever
2020/08/18
1.3K0
Server层表级别对象字典表 | 全方位认识 information_schema
在上一篇《Server层统计信息字典表 | 全方位认识 information_schema》中,我们详细介绍了information_schema系统库的列、约束等统计信息字典表,本期我们将为大家带来系列第三篇《Server层表级别对象字典表 | 全方位认识information_schema》。
老叶茶馆
2020/11/26
1.1K0
MySQL常用表结构查询语句
在我们使用数MySQL据库进行查询或者建表时,经常需要查看表结构,下面以employees数据库中的departments表为例进行表结构查询:
星哥玩云
2022/08/17
6.5K0
故障分析 | MySQL 扩展 VARCHAR 长度遭遇问题的总结
经过排查分析得出,这是由于改表系统解析改表需求得出错误的改表方案导致,即这类改表可以满足快速改表操作(直接使用 ALTER TABLE),理论上任务下发后能马上改完,但是工单结果是执行触发 10 秒超时,最终工单失败。
爱可生开源社区
2024/01/31
3740
故障分析 | MySQL 扩展 VARCHAR 长度遭遇问题的总结
[MySQL] INFORMATION_SCHEMA 数据库包含所有表的字段
sql注入后可以通过该数据库获取所有表的字段信息 1. COLLATIONS表 提供有关每个字符集的排序规则的信息。 COLLATIONS表包含以下列: COLLATION_NAME 排序规则名称。 CHARACTER_SET_NAME 与排序规则关联的字符集的名称。 ID 排序规则ID。 IS_DEFAULT 排序规则是否为其字符集的默认值。 IS_COMPILED 字符集是否已编译到服务器中。 SORTLEN 这与对字符集中表示的字符串进行排序所需的内存量有关。
唯一Chat
2019/09/10
1.4K0
使用信息架构视图访问数据库元数据
元数据简介 元数据 (metadata) 最常见的定义为"有关数据的结构数据",或者再简单一点就是"关于数据的信息",日常生活中的图例、图书馆目录卡和名片等都可以看作是元数据。在关系型数据库管理系统 (DBMS) 中,元数据描述了数据的结构和意义。比如在管理、维护 SQL Server 或者是开发数据库应用程序的时候,我们经常要获取一些涉及到数据库架构的信息: 某个数据库中的表和视图的个数以及名称 ; 某个表或者视图中列的个数以及每一列的名称、数据类型、长度、精度、描述等; 某个表上定义的约束;
张善友
2018/01/19
8740
MySQL information_schema详解 COLUMNS
如果一个栏位在多个索引中,COLUMN_KEY只会显示其中优先级最高的一个,顺序为PRI, UNI, MUL
bsbforever
2020/08/18
4K0
mysql的information_schema下的COLUMNS表详解
`information_schema.COLUMNS` 表是 MySQL 中的一个元数据表,用于存储数据库中所有表的列信息。这个表对于查询和管理数据库结构非常有用,可以帮助您了解每个表中的列定义、数据类型、约束等细节。
jack.yang
2025/04/05
1020
Mysql高级7-存储过程
  存储过程是事先经过编译并存储在数据库中的一段sql语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。存储过程思想上很简单,就是数据库sql语言层面的代码封装与重用。
Se7eN_HOU
2023/08/15
8640
mysql的query rewrite插件介绍
https://sakthismysqlblog.wordpress.com/2020/04/05/mysql-query-rewritten-plugin-now-supporting-delete-insert-update-replace/
保持热爱奔赴山海
2022/04/26
1.4K0
[Go实战]golang使用mysql实例和第三方库Gendry
Builder用于生成sql语句,手写sql简单直观但是可维护性差,并且硬编码容易出错,如果遇到大where in查询,且in的集合内容又是动态的就很麻烦了。
TOMOCAT
2020/06/10
1.2K0
MySQL案例:各类临时文件的存放位置
在MySQL中,存在各种各样的临时文件,其存放位置是五花八门,且不同版本也不尽相同,主要包括以下:
brightdeng@DBA
2020/09/02
6.7K1
MySQL案例:各类临时文件的存放位置
SQL得到任意一个存储过程的参数列表sp_procedure_params_rowset
SQL得到任意一个存储过程的参数列表sp_procedure_params_rowset exec sp_procedure_params_rowset 'up_rpt营业收入汇总表' PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME PARAMETER_NAME ORDINAL_POSITION PARAMETER_TYPE PARAMETER_HASDEFAULT PARAMETER_DEFAULT IS
landv
2018/05/24
6950
MySQL 有效利用 profile 分析 SQL 语句的执行过程
在日常的工作中,我们通常要分析 SQL 语句的性能,通过会使用到执行计划,利用执行计划来分析 SQL 语句的性能,并进行相应的优化;本文将利用 profile 分析 SQL 语句的执行过程来辅助的分析 SQL 语句,做好优化;
JiekeXu之路
2019/06/20
4.9K0
MySQL 有效利用 profile 分析 SQL 语句的执行过程
旺财C# .NET代码生成器支持DTcms MySQL版生成了
昨天跟一资深老用户沟通之后,发现DTcms MySql版用得人越来越多了,整个运行于Linux主机下,比一定要Windows和MSSQL数据库的要求降低了很多,优势太明显。
崔文远TroyCui
2019/02/26
1.1K0
旺财C# .NET代码生成器支持DTcms MySQL版生成了
《MySQL核心知识》第10章:自定义存储过程和函数
今天是《MySQL核心知识》专栏的第10章,今天为大家系统的讲讲MySQL中如何自定义存储过程和函数,希望通过本章节的学习,小伙伴们能够举一反三,彻底掌握MySQL中关于自定义存储过程和函数的知识。好了,开始今天的正题吧。
冰河
2022/12/01
3.8K0
《MySQL核心知识》第10章:自定义存储过程和函数
Mysql中的自定义函数和自定义过程
转载自 http://www.cnblogs.com/lyhabc/p/3793524.html
allsmallpig
2021/02/25
4.7K0
MySQL 8.0新特性: 数据字典
目前MySQL 8.0最新版本为8.0.23版本,针对8.0的新特性,从春节前开始做了一些相关学习和测试,后续会不阶段的分享一些8.0的新特性,供大家一起参考和学习;
SEian.G
2021/03/03
2.3K0
Server层统计信息字典表 | 全方位认识 information_schema
在上一篇《初相识|全方位认识information_schema》中,我们针对 information_schema 系统库做了一个简单的认识,本期我们将为大家带来系列第二篇《Server层统计信息字典表 | 全方位认识 information_schema》,下面请跟随我们一起开始 sys 系统库的学习之旅吧~
老叶茶馆
2020/11/26
1.3K0
推荐阅读
相关推荐
MySQL如何获取存储过程参数?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档