Code前端首页关于Code前端联系我们

mysql中的函数调试 如何调试mysql函数

terry 2年前 (2023-09-30) 阅读数 46 #Mysql
文章标签 Mysql

本文内容列表:

  • 1.如何调用mysql udf函数
  • 2.如何在PHP中使用MySQL操作函数
  • 3.请告诉我如何调试mysql存储过程和函数。
  • 4. Windows下如何编译或调试MySQL
  • 5、mysql中如何自定义函数,如何调用和执行

如何调用mysql udf函数

1)基本自定义函数是扩展MYSQL服务器功能的一类代码。通过添加新的函数,本质上就像使用原生的MYSQL函数abs()或concat()。 UDF是用C(或C++)编写的。也许可以使用 BASIC、.NET 或其他东西,尽管我还没有看到有人这样做。

2)从字面上知道为什么UDF非常有用,尤其是当你需要扩展MYSQL服务器的功能时。下表提供了最佳解决方案的比较:

方法速度语言开发

方法速度语言开发

存储过程慢 SQL ~ 分钟(对于小函数)

对于小函数)

UDF 快 C ~ 时间

UDF 快 C ~时间

本机功能快 C 大调***

疼痛局部函数 快速 C 未知

慢意味着与其他函数相比。与常规 SQL 语句相比,存储过程仍然非常快。

局部函数的小解释:本质上,它们与UDF没有太大区别。但是你必须使用MYSQL资源代码来编写然后重新编译所有内容。这将是大量工作,并且必须使用最新版本的 MYSQL 并行完成。

3)这部分很简单。当您使用完 UDF 后,只需使用它即可。例如:“SELECT MyFunction(data1, data2) FROM table”

4) 编写UDF

现在开发并编写UDF:

创建一个新的共享库项目(本例中使用VC++ 6.0创建一个默认的 DLL)

首先您需要一些头文件。这些头文件是标准头文件,是MYSQL服务器的include文件夹中的文件

#ifdef STANDARD

/* STANDARD已定义,不使用mysql函数*/

#include

#include

#include

#ifdef __WIN__

typedef 无符号 __int64 ulong long; /* 微软的 64 位类型 */

typedef __int64 longlong;

#else

typedef unsigned long long long long;

typedef long long longlong;

#ENDif* /*__W #否则

#include

#include

#endif

#include

#include

static pthread_mutex_t LOCK_hostname;

现在您需要决定您需要什么样的功能。基本上有两种可能性:

该函数是聚合函数吗? (稍后你会学到很多关于聚合函数的知识)

返回类型是什么?有 4 个选项:

类型描述

STRING 合法字符串,转换为 char* 类型

INTEGER 常规整型变量,转换为 64 位整数类型

REAL 类型 捕获点,转换为 double 类型

DECIAML 类型 This 和 Notally完成后,MYSQL 会进行字符串处理吗

现在讨论非聚合函数。 MYSQL 在使用 UDF 时使用的一些函数必须声明并执行,但首先必须确认一些必要的结构:

UDF_INIT:

类型名称说明

my_bool Maybe_null 如果函数可以返回 NULL unsigned int 则为 1 REAL 函数的小数

字符串函数的 unsigned long max_length

char * 函数数据的 ptr 自由指针

my_bool const_item 如果结果独立,则为 0 ❀UDF 名称 unsigned int arg_count 成员数量

enum Item_result * arg_type 成员类型数组

char ** args 指向成员的指针数组

unsigned long * lengths 成员长度数组(对于 char) ❝ Maybe_null “maybe_null”标记数组

char ** attribute 指向成员属性的指针数组

unsigned long * attribute_lengths 属性长度数组

现在看一下函数:

De-/Initialization:

MyClapse_extern(INTUD_init_it) initid, UDF_ARGS *args ,

char *message)

{

//很重要的一点就是建立内存

//需要

//需要一个long变量来存储检测数 //虽然

本例中不需要 longlong* i = new longlong; // 创建变量

*i = 0; // 设置初始值

//指针变量存储为字符指针

//验证不会遇到类型问题

initd-ptr = (char*)i;

//注册成员的格式

if (args-arg_count != 1)

{

strcpy(message,"MyTest() 需要一个参数");

return 1;

} if (args-arg_type [0] != INT_RESULT)

{

strcpy(message,"MinTest() 需要一个整数");

return 1;

0

;

}

外部“C”无效MyTest_deinit(UDF_INIT * initid)

{

//这里必须清除分配的内存

//函数介绍

delete (longlong*)initid-ptr;

}

实际函数:

external "C" longlong MyTest( UDF_INIT *initid, UDF_ARGS *args,

char *is_null, char *error)

{

/*最后,这是实际工作部分。针对每条记录调用此函数,并将返回值或指向当前值的指针存储在变量 UDF_ARGS 中。必须检索该值、完成计算并返回该值。请注意,MyTest_init 中分配的内存可以通过 UDF_INIT 变量访问。在此示例中,每个值将设置为 5

*/

return *((longlong*)args-args[0])+5;

}

全部完成!现在需要编译链接库,然后将其复制到操作系统可以加载的目录中。通常在WINDOWS中它是系统变量的定义路径。就我个人而言,我使用 MYSQL 服务器上的 bin 文件夹。必须确认该文件夹不能被其他MYSQL访问。然后验证MYSQL需要的所有功能。

您需要告诉 MYSQL,这应该很简单:执行以下 SQL 语句:

CREATE [AGGREGATE] FUNCTION MyTest

RETURNS [INTEGER|STRING|REAL|DECIMAL] SONAMEex_the_namenowries 您可以将其用作其他用途一个函数。

5)成员函数:

现在我们来谈谈成员函数。当UDF是成员函数时,必须添加一些函数,并且一些函数可以以不同的方式使用。调用顺序为:

调用 yTest_init 分配内存(和普通 UDF 一样)

MYSQL 通过 GROUP BY 对表进行分类

每组第一行调用 MyTest_cleard 调用 MyT_ad 组第一列

更改组后或更改最后一列后调用 MyTest 即可获取结果

重复 3 到 5,直到处理完所有列。

调用MyTest_deinit清除内存

现在让我们看看新聚合函数所需的函数。此示例将简单地添加所有值。 (就像本地SUM函数一样)

void MyTest_clear(UDF_INIT *initid, char *is_null, char *error)

{

/*将每个新组的总数重置为0,当然必须是一个allocate longlong 类型变量在 init 函数中,被赋值给指针

*/

*((longlong*)initid-ptr) = 0;

}

void MyTest_add(UDF_INIT *initid , UDF_ARGS * args, char *is_null, char *error)

{

//将当前值添加到每列的总计中

*((longlong*)initid-ptr) = *((long long) *) initid- ptr) +

*((longlong*)args-args[0]);

}

longlong MyTest(UDF_INIT *initid, UDF_ARGS *args, char *er_null, char * error)

{

//最后返回总值

return *((longlong*)initid-ptr);

}

6) 补充问题:

一定要小心在编写一些复杂的UDF时的几个问题:

字符串函数必须返回一个指向结果的指针,并设置*result和*length作为返回值的库和长度值。例如:

memcpy(result, "result string", 13);

*length = 13;

MyTest 创建的结果缓冲区为 255 字节。如果里面保存的是结果。不用担心结果的内存分配。

如果字符串函数应返回长度超过 255 个字节的字符串。必须使用 malloc 或新的 MyTest_init 或 MyTest 函数分配它,然后使用 MyTest_deinit 释放它。分配的内存地址可以使用 UDF_INIT 指针保存并在 MyTest 中重用。

要在主函数中指定错误返回,请将 *error 设置为 1:如果 MyTest() 将某列的 *error 设置为 1,则对于当前列以及调用的任何 MyTest(),该函数的值为 NULL。语句中的并发列请求。

如果您想了解更多,请查看MYSQL在线帮助。

7) 一些准则:

如果您确实希望 UDF 运行良好,这里有一些建议:)

不要在 UDF 中调用其他程序或进程

不要保存本地信息。 (这些已经在普通库中共享)

不要分配任何全局或静态变量。

始终找到会员的类型。与 MYSQL 一样,所有类型都会转换为字符类型。如果将字符类型转换为整型指针,则可能会发生错误。

特别注意内存分配。如果出现内存泄漏问题,服务器就会彻底崩溃!

8)调试UDF

调试UDF需要勇气,因为如果UDF出现问题,每次都会导致整个MYSQL服务器死掉。于是我写了一个命令行工具来解决这个问题。只需运行它,它就会模拟“SELECT”调用并将结果保存到打印所有结果行的库文件中。因此,当 UDF 出现错误时,只有应用程序崩溃,而不是整个服务器崩溃。

如何在PHP中使用MySQL操作函数

1。创建 MySQL 连接: mysql_connect

resource mysql_connect([string $server[, string $username [, string $password [, bool $new_link [, int $clientflags]]]]])

打开或重用连接到 MySQL 服务器。其中,server代表MySQL服务器,可能包含端口号,如“hostname:port”。 username和password分别表示用于登录MySQL服务器的用户名和密码。

2。选择 MySQL 数据库: mysql_select_db

bool mysql_select_db(string $database_name[, Resource $link_identifier])

设置与指定连接 ID 关联的服务器上的当前数据库。如果未指定连接标识符,则使用最后打开的连接。如果没有打开的连接,该函数将调用不带参数的 mysql_connect() 来尝试打开数据库连接。如果成功则返回 true,如果失败则返回 false。每个后续的 mysgl_query() 调用都将作用于活动数据库。

3。执行查询: mysql_query

resource mysql_query(string $query[, resource $link_identifier])

将查询发送到与指定连接 ID 关联的服务器上当前活动的数据库。如果未指定 link_identifier,则使用最后打开的连接。如果没有打开的连接,该函数将尝试调用不带参数的mysql_connect()函数来建立连接,并且查询结果将被缓存。 mysql_query() 仅针对 SELECT、SHOW、EXPLAIN 或 DESCRIBE 语句返回资源 ID,如果查询执行不正确,则返回 false。对于其他类型的 SQL 语句,mysgl_query() 在执行成功时返回 true,在发生错误时返回 false。非 false 返回值意味着查询有效并且可以由服务器执行,但不指定受影响或返回的行数。查询可能成功执行但不影响或返回任何行。

4。从结果集中获取一行作为枚举数组: mysql_fetch_row

array mysql_fetch_row(resource $result)

从与指定结果标识符关联的结果集中获取一行数据并将其作为数组返回。每个结果列都存储在索引数组的一个单元中,从偏移量 0 开始。按顺序调用 mysql_fetch_row() 将返回结果集中的下一行,如果没有更多行,则返回 false。

5。从结果集中以关联数组或数值数组或两者的形式获取数组: mysql_fetch_array

array mysql_fetch_array(resource $result[, int $result_type])

mysql_fetch_row() 的扩展版本。除了将数据作为数字索引存储在数组中之外,您还可以使用字段名称作为键将数据存储为关联索引。如果结果中存在重复的字段名称,则最后一列优先。要访问具有相同名称的其他列,请按数字索引该列或为该列指定别名。对于具有别名的列,请使用别名来访问其内容。

6。关闭 MySQL 连接: mysql_close

bool mysql_close([resource $link_identifier])

mysql_close() 关闭与指定连接标识符关联的 MySQL 服务器的非持久连接。如果未指定 link_identifier,则关闭最后打开的连接。

PHP中使用MySQL数据库(mysql.php)的示例

?php//连接MySQL数据库

mysql_connect('localhost', 'root', '123');/ /当前数据库

//相当于执行USE test

mysql_select_db('test');

//在当前数据库中执行SQL语句

$query = "SELECT * FROM Student";

$result = mysql_query($query);

//操作上一次查询返回的结果集。注意,一般需要$result变量

while($student = mysql_fetch_array($result)) {

echo 'pre ';

print_r($student);

echo '/pre';

}

请告诉我如何调试mysql存储过程和函数

终于找到了一个好东西:Core Lab MyDeveloper Studio,它几乎有我想要的所有功能,尤其是代码提示和调试功能!不幸的是,我找不到注册引擎。您可以试用 60 天。强烈推荐

如何在Windows下编译或调试MySQL

只需使用 vs code。

视觉学习代码

Visual Studio Code(简称VS Code)是微软开发的开源文本编辑器,支持Windows、Linux和macOS操作系统。它支持调试,内置Git版本控制功能,还具有开发环境功能,例如代码完成(类似于IntelliSense)、代码片段、代码重构等。编辑器支持自定义配置,例如更改主题颜色、键盘快捷键、编辑器属性和其他参数。它还支持扩展,并在编辑器中具有内置的扩展管理功能。

安装 LLDB

LLDB 是 LLVM 编译器的一部分。推荐使用Homebrew安装LLVM工具包。不建议使用系统自带的LLDB。安装前必须创建证书,否则无法安装。步骤如下:

创建完成后,开始安装LLVM

brew install llvm --with-python@2 --with-lldb

安装插件

VS代码有其自带调试功能。这里我推荐使用LLDB Debugger插件。

 接下来,配置项目的调试参数。

配置调试参数

使用VS Code打开MySQL源码目录,选择侧边栏的debug栏,添加配置,program输入程序路径进行调试,这里选择你编译的mysqld路径,args输入程序启动位置。所需的参数通常在 mysqld 配置文件中指定。现在配置就完成了,是不是很简单呢?

开始调试

单击开始按钮。如果启动后不指定断点,mysqld将正常启动。如果断点被触发,会显示如下图。

整个调试窗口基本分为六部分,所有调试操作都在这里进行:

1:显示变量信息

2:设置焦点变量

3:显示调用堆栈信息 4 :设置断点信息,也可以在代码行号前设置断点

5:代码显示区域,上面是调试按钮,包括继续/单步/步入/步出/重启/停止

6:调试终端输入输出区域

断点设置

在代码行号前单击即可为该行为设置断点,或根据条件设置断点。以 ConditionalBreakpoint 选项为例。程序启动时,会根据你设置的条件表达式来决定是否触发断点。

条件断点用于当目标变量达到某个状态时触发断点并跳过其余部分继续执行。例如:当将变量设置为等于目标表名称时触发断点,并跳过其他表。相对函数名称断点可以节省大量的手动跳过。

远程调试

如果你想在远程Linux服务器上调试MySQL,上面的方法就不适合了。这种情况下就需要远程调试。 lldb和gdb都支持远程调试。这里我们以lldb为例。

需要先在远程主机上安装lldb,使用yum安装,源地址在这里

remote$ yum install -y llvm-toolset-7

安装完成后,启动lldb -server

remote$ /opt/rh/llvm-toolset-7/root/usr/bin/lldb-server-platform --listen "*:9191" --server

接下来添加新的配置项在VS Code调试界面中。

{

"类型":"lldb",

"请求":"附加",

"名称":"远程附加",

"程序":"~/mysql5626/ usr/local/mysql/bin/mysqld",

"pid":"target_pid",

"initCommands": [

"平台选择远程linux",

"平台连接连接:/ /remote_host:9191"

],

"sourceMap": {

"/export/home/pb2/build/sb_0-15908961-1436910670.17/mysql"/Usql-5:6。 workbench/mysql-server"

}

},

程序:本机也要复制一份目标程序并加载

pid:填写远程主机的mysqld进程ID

sourceMap:完成mysqld编译代码路径和本机代码库路径的映射,以便调试时可以看到代码与程序的关系

注意:调试前记得将代码切换到与目标程序版本匹配的分支

mysql中如何自定义函数,如何调用执行

create function 函数名(参数列表)

返回返回值类型

函数文本

执行方法很简单:

load

返回

s**create 函数名real |integer}

* * soname 您定义的动态目录位置

发布!

** 删除函数函数名称

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门