MySQL UDF 允許以 C/C++ 擴充伺服器功能。Windows 版需建置 DLL,本文記錄 Visual C++ 6.0/Visual Studio 專案建置完整流程。
include 目錄、libmysql.lib)。mysqld.dsw 工作區 (或建立新方案)。my_udf → An Empty DLL Project。my_udf.cpp:#include
#include
#include
extern "C" {
char *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
}
char *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) {
char *me = "my name";
return me;
}
my_udf.def:LIBRARY UDF_EXAMPLE
DESCRIPTION 'Example Using UDF with VC'
VERSION 1.0
EXPORTS
my_name
include 目錄路徑 (如 ..\include)。HAVE_DLOPEN。my_udf.dll。my_udf.dll。my_udf.dll 至系統路徑目錄 (如 C:\Windows\System32 或 MySQL bin 目錄)。mysql> CREATE FUNCTION my_name RETURNS STRING SONAME 'my_udf.dll';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT my_name();
+-----------+
| my_name() |
+-----------+
| my name |
+-----------+
| 結構體 | 用途 |
|---|---|
| UDF_INIT | 初始化/反初始化資訊:maybe_null, decimals, max_length, ptr (使用者指標) |
| UDF_ARGS | 引數資訊:arg_count, arg_type[], args[], lengths[] |
my_bool my_name_init(UDF_INIT *initid, UDF_ARGS *args, char *message) {
if (args->arg_count != 0) { strcpy(message, "my_name() takes no arguments"); return 1; }
initid->max_length = 20;
return 0;
}
void my_name_deinit(UDF_INIT *initid) {
// 釋放 initid->ptr 分配的記憶體
}
char *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) {
return "my name";
}
註冊時:CREATE FUNCTION my_name RETURNS STRING SONAME 'my_udf.dll' 會自動呼叫 _init/_deinit (若存在)。
--skip-grant-tables 並加載 plugin_dir 指定目錄,避免污染生產環境。