MySQL C++ UDF返回结果呈十六进制的原因及解决办法
问题描述
我用C++实现了一个MySQL的HelloWorld自定义函数(UDF),代码如下:
extern "C" char * hello(UDF_INIT * initid, UDF_ARGS * args, char * result, unsigned long * length, char * is_null, char * error) { strcpy(result, "Hello"); strcat(result, " "); strcat(result, args -> args[0]); * length = strlen(result); return result; } extern "C" bool hello_init(UDF_INIT * initid, UDF_ARGS * args, char * message) { if (args -> arg_count != 1) { strcpy(message, "hello requires exactly one string argument"); return 1; } if (args -> arg_type[0] != STRING_RESULT) { strcpy(message, "hello requires exactly one string argument"); return 1; } initid -> max_length = args -> lengths[0] + strlen("hello "); return 0; /* true */ } extern "C" void hello_deinit(UDF_INIT * initid) { return; }
我通过以下SQL语句创建该函数:
CREATE FUNCTION remote returns string SONAME 'Hello.so';
执行查询语句后,结果以十六进制格式显示:
mysql> select hello ('test'); +--------------------------------+ | hello ('test') | +--------------------------------+ | 0x48656C6C6F2074657374 | +--------------------------------+ 1 row in set (0,00 sec)
请问这是什么原因,如何将结果以varchar格式展示?
原因与解决办法
原因
你创建UDF时指定返回类型为string,MySQL会将这个类型识别为二进制字符串(BINARY),而非普通的非二进制字符串(VARCHAR/CHAR)。二进制字符串默认会以十六进制格式输出,这就是你看到十六进制结果的原因。
另外注意到你创建函数时写的是CREATE FUNCTION remote returns string,但实际调用的是hello('test'),这里函数名不一致属于笔误,正确的创建语句应为CREATE FUNCTION hello returns string SONAME 'Hello.so';,不过这不是导致十六进制输出的直接原因。
解决办法
有两种方式可以让结果以普通字符串格式展示:
方法1:修改UDF的返回类型声明
在创建UDF时,将返回类型从string改为char(或varchar,MySQL会将其视为非二进制字符串类型):
CREATE FUNCTION hello returns char SONAME 'Hello.so';
修改后MySQL会将函数返回值识别为非二进制字符串,查询时直接显示文本内容。
方法2:查询时显式转换类型
如果不想重新创建函数,可以在查询时用CHAR()或CONVERT()函数将二进制结果转换为普通字符串:
-- 使用CHAR()转换 SELECT CHAR(hello('test')); -- 使用CONVERT()转换 SELECT CONVERT(hello('test') USING utf8mb4);
内容的提问来源于stack exchange,提问作者sama
相关产品推荐
相关产品推荐

