【问题标题】:Setting collation_connection using libmysqlclient C API使用 libmysqlclient C API 设置 collat​​ion_connection
【发布时间】:2017-01-19 15:41:37
【问题描述】:

我正在使用 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() 使用的集合

我想以一种mysql_real_escape_string() 受到影响的方式更改字符集和排序规则。这样做的正确方法是什么?

【问题讨论】:

    标签: mysql c utf-8 collation libmysql


    【解决方案1】:

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

    别忘了你的表格列也应该声明为CHARACTER SET utf8mb4

    【讨论】:

    • 好吧,它不是由 root 或任何其他超级用户执行的,但它如何影响 mysql_get_character_set_info() 函数的结果?如何以影响 mysql_real_escape_string() 的方式设置字符集和排序规则?
    • 我也照你说的做了,但一切都一样!
    猜你喜欢
    • 2017-09-17
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2011-11-25
    相关资源
    最近更新 更多