【问题标题】:Read utf-8 characters from MySql into C variables将 MySql 中的 utf-8 字符读入 C 变量
【发布时间】:2011-10-03 18:32:12
【问题描述】:

我有一个 mysql 数据库,有 CHAR(255) 类型的两个字段(名字、姓氏)和字符集 utf_general_ci

使用 mysqlphpadmin 我将名字设置为“Sàm”,将姓氏设置为“Èkméïß” 在我的 c 代码中,我使用以下方法检索这些字段:

sscanf(row[SDB_INV_COL_FIRSTNAME],"%[^\n]",db_firstname);
sscanf(row[SDB_INV_COL_LASTNAME],"%[^\n]",db_lastname);

但是当我这样做时,db_firstname 变量设置为 'S\340m' 并且 db_lastname 设置为 '\310km\351\357\227'

似乎字符正在切换到 unicode 或其他字符集,我不知道如何纠正这个问题!如何将我的字段以 utf8 格式输出到我的 C 变量中?

我的连接是这样设置的(注意字符集设置):

conn = mysql_init(NULL);
if(conn == NULL) {
sprintf(tempstr,"Survey database connection init error: [%u] %s", mysql_errno(conn), mysql_error(conn));
logmessage(LLEVEL_ERROR, INTERROR_MYSQLCONNECT_FAILED, tempstr);
sdberrorstate = TRUE;
return FALSE;
}

if(!mysql_real_connect(conn, program_options.sdbhost , program_options.sdbusername , program_options.sdbpassword, program_options.sdbdatabase, program_options.sdbport, NULL, 0)) {
sprintf(tempstr,"Survey database real connection error [%u] [%s]", mysql_errno(conn), mysql_error(conn));
logmessage(LLEVEL_ERROR, INTERROR_MYSQLCONNECT_FAILED, tempstr);
sdberrorstate = TRUE;
return FALSE;
}

if(mysql_options(conn, MYSQL_SET_CHARSET_NAME, "utf8") != 0) {
sprintf(tempstr,"Survey database set characterset utf8 error [%u] [%s]", mysql_errno(conn), mysql_error(conn));
logmessage(LLEVEL_ERROR, INTERROR_MYSQLCONNECT_FAILED, tempstr);
sdberrorstate = TRUE;
return FALSE;
}

【问题讨论】:

  • 这些是八进制转义序列,代表原始字符仅供参考。
  • 如何设置与 MySQL 的连接?
  • 我修改了上面的帖子以显示我的连接设置。我将字符集设置为 utf8,虽然我可以做到这一点......但没有区别
  • 您应该在连接前设置选项。
  • 我发布了一个“set names utf8”并将 CLIENT 设置为 utf8,字符串开始按预期出现!谢谢

标签: mysql c utf-8 field


【解决方案1】:

您正在接收 ISO-8859-1 格式的数据。 MySQL 不仅有数据库表的编码设置,您还应该正确设置 MySQL 客户端使用的编码。

编辑:

来自mysql_options() docs:

mysql_options() 应该在 mysql_init() 之后和 mysql_connect() 或 mysql_real_connect() 之前调用

【讨论】:

  • 我修改了上面的帖子以显示我的连接设置。我的mysql_options不是为mysql客户端指定UTF8吗?
猜你喜欢
  • 2011-04-11
  • 2016-02-17
  • 2013-05-05
  • 2017-05-14
  • 1970-01-01
  • 2011-09-06
  • 2016-05-03
  • 2018-07-28
  • 2019-11-12
相关资源
最近更新 更多