windows下编写mysql UDF函数的失败经历,与ubuntu下的成功编译经历

一、第一个demo

参照http://www.cnblogs.com/raker/p/4377343.html

实际运行时,出现了2点问题:

1、使用了VisualStudio,链接include文件时发现无法对应到应该的头文件。

于是,采用物理地址的方法链接。有文章说道mysql安装时,需要同时安装开发套件才能有这些开发的头文件,本文使用的免安装版未遇到这些问题。

2、编译时遇到错误。

error:SOCKETdoes not name a type
解决方法:定位到mysql.h中的SOCKET位置,将my_socket改为int

http://cache.baiducontent.com/c?m=9d78d513d99401ef05ad837f7d01d6150e54f1743ca6c7140f95ce19ca331d564717f4bb5635117485982b2616af3800b7b62172465f73e8ccdf883b8eac925969c36563645bc61f1d895fe9895124b23d8d1baffc48bee7b465d3fa8c8e9a4353bd0258259db3cc0d41529132ac552ce0a5984d155d11bef07138ae00206f882336e01aaea1256e71ddab9b4b4cb576833e4680af43e32912c355ef5d4c&p=882a9645dcb152e70db58c2d02149f&newp=c963c54ad5c34bf11af3d52d021498231610db2151d4d4106b82c825d7331b001c3bbfb42323140fd0c27d6d04a5495aebf634793c0323a3dda5c91d9fb4c57479d6652a31&user=baidu&fm=sc&query=error%3A+%60SOCKET%27+does+not+name+a+type&qid=f21dbaf500016eda&p1=1


#if defined(_WIN32)
#define DLLEXP __declspec(dllexport)
#else
#define DLLEXP
#endif


#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <D:/mysql-5.6.26-winx64/include/mysql.h>


#ifndef  __mysqludf
#define  __mysqludf
extern "C"{
#endif

	//my_name
	DLLEXP
		my_bool my_name_init(UDF_INIT * initid, UDF_ARGS * args, char * message){
		return 0;
	}

	DLLEXP
		void my_name_deinit(UDF_INIT *initid){}

	DLLEXP
		char* my_name(UDF_INIT *initid, UDF_ARGS *args, char * is_null, char * error){
			return "mysql_udf";
		}


#ifdef  __mysqludf
}
#endif


接下来,将刚才生成的winsql_udf.dll拷贝到D:\mysql-5.6.26-winx64\lib\plugin中去。

定位到D:\mysql-5.6.26-winx64\bin,执行mysql -u root -p   (不以root权限开启会遇到ERROR 1044(42000)的错误)


此时遇到一个无可逾越的难题,出现errno:193的错误。

给出一些找到的资料,lz尽力了。

1)第一个link是github中的参考,提出了常见udf错误的原因。

https://github.com/mysqludf/lib_mysqludf_str/blob/master/README.win_x86.txt

2)第二个link是mysql提供的udf手册,install and compile

http://dev.mysql.com/doc/refman/5.7/en/udf-compiling.html


lz没有解决193的问题,于是没办法,在虚拟机的ubuntu12里重复了上述的步骤。

二、我的UDF

lz的环境是ubuntu12.04 64bit,安装了mysql。首先给出几个命令。

查看ubuntu版本:>uname -a

查看mysql版本:>mysql --version


1、第一步,在桌面建立文件夹my_udf,并创建文本my_udf.cc,把windows下的8个include文件拷贝到my_udf下的mysql-include文件夹中。

my_alloc.h  my_global.h  my_list.h  mysql.h  mysql_com.h  mysql_time.h  mysql_version.h  typelib.h

参考上一节的link。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include </home/ubuntu/Desktop/my_udf/mysql-include/mysql.h>

extern "C" {

	my_bool my_name_init(UDF_INIT *initid, UDF_ARGS *args, char *message){
		return 0;
	}
	void my_name_deinit(UDF_INIT *initid){}
	char* my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error){
		return "mysql_udf";
	}

}

之后执行gcc指令,生成so链接库。

gcc -shared -o my_udf.so my_udf.cc -fPIC

2、查看mysql的plugin文件夹位置

~>SHOW VARIABLES LIKE 'plugin_dir';

一般位于usr/lib/mysql/plugin/下,执行mv指令,将生成的my_udf.so文件移动到该文件夹下。

 sudo mv my_udf.so /usr/lib/mysql/plugin/my_udf.so


3、在mysql中注册并使用

添加

CREATE FUNCTION my_name RETURNS STRING SONAME 'my_udf.so';

删除

drop function my_name;



4、真正的UDF功能函数

先马,坑以后填。








©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页