在MySQL中创建UDF函数时出错

在MySQL中创建UDF函数时出错,mysql,c,Mysql,C,我试图为MySQL创建一个UDF函数(MySQL可执行的C函数),但我遇到了左右两方面的问题。我会直接给你密码的。我有一个文件levenshtein.c,其中包括以下声明和相应的实现: my_bool sql_levenshtein_init(UDF_INIT *initid, UDF_ARGS *args, char *message); void sql_levenshtein_deinit(UDF_INIT *initid); longlong sql_leve

我试图为MySQL创建一个UDF函数(MySQL可执行的C函数),但我遇到了左右两方面的问题。我会直接给你密码的。我有一个文件
levenshtein.c
,其中包括以下声明和相应的实现:

my_bool     sql_levenshtein_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
void        sql_levenshtein_deinit(UDF_INIT *initid);
longlong    sql_levenshtein(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
我编译该文件(如果相关的话,针对std=c99和arch=i386)。我将创建的.so文件复制到我的mysql插件文件夹中。我进入mysql并执行命令

mysql> create function sql_levenshtein returns int soname 'levenshtein.so';
我没有成功地创建函数,而是收到了这个错误

ERROR 1127 (HY000): Can't find symbol 'sql_levenshtein' in library
在试图解决这个问题时,我没有提供多少有用的信息。在谷歌搜索之后,我使用命令
nm
查看.so文件。我得到了这个输出:

00001600 t ___inline_memset_chk
00001870 t ___inline_strcpy_chk
         U ___memset_chk
         U ___stack_chk_fail
         U ___stack_chk_guard
         U ___strcpy_chk
00001220 T _cell_value
         U _free
00001180 T _is_levenshtein_within_normthresh
00001100 T _is_levenshtein_within_thresh
00001460 T _levenshtein
00000cf0 T _levenshtein_k
         U _malloc
00001400 t _minimum
00001660 T _normlevenshtein
000018f0 T _sql_levenshtein
000018c0 T _sql_levenshtein_deinit
00001710 T _sql_levenshtein_init
00001df0 T _sql_levenshtein_within_normthreshold
00001dd0 T _sql_levenshtein_within_normthreshold_deinit
00001d00 T _sql_levenshtein_within_normthreshold_init
00001c00 T _sql_normlevenshtein
00001be0 T _sql_normlevenshtein_deinit
00001b20 T _sql_normlevenshtein_init
         U dyld_stub_binder
注意
\u sql\u levenshtein
,因此该函数似乎存在。不知道还有什么会有帮助。谢谢你的指导

库尔特

========= 回应评论的最新情况: 好吧,无论如何,我也这么做了

mysql> create function _sql_levenshtein returns int soname 'levenshtein.so';
ERROR 1127 (HY000): Can't find symbol '_sql_levenshtein' in library

所以这似乎不是问题的根本原因。也许我遗漏了什么。

我不知道您是否找到了答案,但是当您在MySQL中创建函数时,必须使用您定义的函数名。因此,如果您有一个名为“my_func_UDF”的自定义项,并且在代码中有一个名为my_func()的东西,那么在您的示例中,您将其称为:

 longlong sql_levenshtein(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
这是所有神奇发生的地方,您必须在create语句中使用此函数的名称,即create函数My_Func返回(字符串、整数、实数)SONAME“SO文件的名称”

上述代码中的示例:

 CREATE FUNCTION sql_levenshtein RETURNS INTEGER SONAME "levenshtein.so";

你定义了某个东西,然后又称它为其他东西,这是你的错误。

sql\u levenshtein
\u sql\u levenshtein
不是同一个符号。你肯定把.so文件放在正确的位置了吗?它在哪里?
显示变量,如“%plu%”
给出
/usr/local/mysql/lib/mysql/plugin
,以及
ls/usr/local/mysql/lib/mysql/plugin | grep leven
给出
levenshtein。因此
@KurtSpindler,我在文档中读到,如果文件不是以“lib”开头,一些系统动态链接器就无法识别该文件。这是一个外部机会,但尝试将其重命名为“liblevenshtein.so”(并相应地更新CREATE函数调用中的so名称)也无妨。我还有最后一个想法。这也是来自文档:“为了能够使用UDF,您需要动态链接mysqld。不要使用--with mysqld ldflags=-all static配置MySQL。”我想只要确保该标志正确(可能是正确的,但我想值得检查一下)