2016-07-27 97 views
0

我有在MySQL 5.7.13使用用戶定義函數(Linux)的一個問題:MySQL的UDF返回INT代替STRING

此功能在MySQL使用定義:

CREATE FUNCTION PHPParse RETURNS STRING SONAME 'php_parser.so' 

與c (& C++)文件如下:

my_bool PHPParse_init(UDF_INIT *initid, UDF_ARGS *args, char *message); 
void PHPParse_deinit(UDF_INIT *initid); 
char* PHPParse(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error); 


my_bool PHPParse_init(UDF_INIT *initid, UDF_ARGS *args, char *message) 
{ 
    initid->maybe_null = 1; 
    if (args->arg_count != 2 || args->arg_type[0] != STRING_RESULT || args->arg_type[1] != STRING_RESULT) 
    { 
    strcpy(message,"PHPParse (p_field_name, p_php_parser_string)"); 
    return 1; 
    } 
    initid->max_length=256; 
    return 0; 
} 


char* PHPParse(UDF_INIT *initid MY_ATTRIBUTE((unused)), UDF_ARGS *args, char *result, unsigned long *length,char *is_null, char *error MY_ATTRIBUTE((unused))) 
{ 
    *is_null = 0; 
    memcpy(result,"begginning",10); 
    *length= (unsigned long)(10); 
    return result; 
} 

如果我用下面的SQL查詢:

SELECT PHPParse('hello','222') as `date` FROM invoices ; 

我得到這樣的結果:

date: 
62656767696e6e696e67 
62656767696e6e696e67 
62656767696e6e696e67 
62656767696e6e696e67 
etc... 

雖然它會應該返回 begginning

我在哪裏錯了?

P.S 編譯命令:

g++ -std=c++11 -fPIC -shared -I/usr/include/mysql -o /usr/lib64/mysql/plugin/php_parser.so include/PHPSerializedDataLoader.cpp PHPParse.cc 

回答

1

如果有人有興趣,一個快速的 「補丁」 是轉換爲字符串:

SELECT CAST(PHPParse(`serialized_infos`, '22') AS CHAR CHARACTER SET utf8) as date1 FROM invoices