使用libmysqlclient C API设置collat​​ion_connection

时间:2016-09-12 08:36:38

标签: mysql c utf-8 collation libmysql

我正在使用libmysqlclient编写一个C程序来将数据(令人惊讶地)插入到数据库中。代码插入的表格的字符集及其排序规则是:

CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

在我的C程序中,我使用mysql_set_character_set()来更改字符集;问题是这个函数只改变字符集而不是整理。如果我使用mysql_get_character_set_info查询字符集和排序规则,结果为:

char-set=utf8mb4, collation=utf8mb4_general_ci

根据MySQL documentation

  

SET NAMES表示客户端将用于将SQL语句发送到服务器的字符集。因此,SET NAMES' cp1251'告诉服务器,“来自此客户端的未来传入消息是字符集cp1251。”它还指定了服务器用于将结果发送回客户端的字符集。

所以我决定使用mysql_optionsMYSQL_INIT_COMMAND更改连接整理:

SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';

结果函数调用如下所示(我在mysql_real_connect()之前调用它):

if(mysql_options(conn, MYSQL_INIT_COMMAND, 
        "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';")) {
    // log the errors and do proper actions
}

但似乎这些命令无法改变字符集和整理!因为现在如果我使用mysql_get_character_set_info()查询字符集,结果是:

char-set=latin1, collation=latin1_swedish_ci

有趣的是,在MySQL端,如果我启用日志并使用MYSQL_INIT_COMMAND命令执行程序执行!但是mysql_get_character_set_info()没有表明这一点!再次根据libmysql的文档:

  

int mysql_set_character_set(MYSQL * mysql,const char * csname)

     

此函数用于设置当前的默认字符集   连接。字符串csname指定有效的字符集名称。   连接排序规则成为默认排序规则   字符集。此函数的作用类似于SET NAMES语句,但是   还设置了mysql-> charset的值,从而影响了字符   mysql_real_escape_string()

使用的set

我想以mysql_real_escape_string()受到影响的方式更改字符集和整理。这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

root用户不执行init命令。 (更具体地说,任何SUPER用户。)建议您为应用程序创建不同的用户。

不要忘记您的表格列也应该声明为CHARACTER SET utf8mb4