我正在使用 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 文档:
SET NAMES 指示客户端将使用什么字符集将 SQL 语句发送到服务器。因此,SET NAMES 'cp1251' 告诉服务器,“来自该客户端的未来传入消息在字符集 cp1251 中。” 它还指定服务器用于将结果发送回客户端的字符集。
所以我决定使用mysql_options
and更改连接排序规则MYSQL_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()
这样做的正确方法是什么?