首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用libmysqlclient设置collation_connection

使用libmysqlclient设置collation_connection
EN

Stack Overflow用户
提问于 2016-09-12 08:36:37
回答 1查看 609关注 0票数 1

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

代码语言:javascript
复制
CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

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

代码语言:javascript
复制
char-set=utf8mb4, collation=utf8mb4_general_ci

根据MySQL文档的说法:

集合名称指示客户端将使用哪个字符集向服务器发送SQL语句。因此,设置名称'cp1251‘告诉服务器,“来自此客户端的未来传入消息位于字符集cp1251中。”它还指定服务器用于将结果发送回客户端的字符集。

因此,我决定使用mysql_optionsMYSQL_INIT_COMMAND更改连接排序规则。

代码语言:javascript
复制
SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';

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

代码语言:javascript
复制
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()查询字符集,结果是:

代码语言:javascript
复制
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 *csname) 此函数用于设置当前连接的默认字符集。字符串csname指定有效的字符集名称。连接排序规则将成为字符集的默认排序规则。这个函数的工作方式类似于SET NAMES语句,但也设置mysql->charset的值,从而影响到mysql_real_escape_string()所使用的字符集。

我想改变字符集和排序规则,使mysql_real_escape_string()受到影响。正确的方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2016-09-12 22:00:32

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39446292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档