c++ - odbc 客户端无法从 MySQL DB 读取 utf8 字符串

标签 c++ mysql utf-8 character-encoding odbc

我有一个带有 utf8 默认字符集的数据库,以及一个包含非 ascii 字符的字符串的表。我可以通过mysql 客户端程序和isql odbc 客户端程序正确读取数据(参见下面的示例)。但是,当我使用 libodbc++ 在我的 C++ 客户端中读取表格时odbc 包装器,我得到垃圾。

奇怪的是,直到现在我一直在使用默认的 MySql 设置,即 latin1 字符集,但数据实际上包含 utf8 字符串。这样,我就可以使用 utf8 了。我将数据库更改为 utf8,以便可以使用 utf8_bin 排序规则。

因为我在客户端使用set names utf8,所以我希望客户端和服务器之间不会发生字符集转换。我错了吗?

您是否知道 libodbc++ 的字符集问题?

编辑:刚刚用“纯”odbc 客户端(令人作呕...)测试了它,工作正常。奇怪,因为 libodbc++ 只是 odbc 的包装器,我希望它不会对数据产生这样的影响。无论如何,嫌疑人是libodbc++库。

mysql> show full columns from tbl_list_domains;
+-------+-----------+-----------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type      | Collation | Null | Key | Default | Extra | Privileges                      | Comment |
+-------+-----------+-----------+------+-----+---------+-------+---------------------------------+---------+
| word  | char(100) | utf8_bin  | NO   | PRI | NULL    |       | select,insert,update,references |         | 
+-------+-----------+-----------+------+-----+---------+-------+---------------------------------+---------+


$ mysql -u mysql navajoLocal <<< "set names utf8; select * from tbl_list_domains order by word limit 30" > out

文件 out 结果很好:

word
aa
ab
ac
ad
ae
...etc.

使用 isql odbc 客户端:

echo -e "set names utf8 \n select * from tbl_list_domains order by word limit 30" |isql mysql3-test -v -b -x0x20 > out

还是不错的。

但是这样:

int main()
{
 ConnectionPtr conn = ConnectionPtr( DriverManager::getConnection("Driver=mysql3;database=navajoLocal;server=localhost;user=mysql;option=3;socket=/var/lib/mysql/mysql.sock") );

 StatementPtr st = StatementPtr( conn->createStatement() );
 st->executeUpdate("set names utf8 collate utf8_bin");

 ResultSetPtr res = ResultSetPtr( st->executeQuery("select word from tbl_list_domains order by word limit 30") );

 string s;
 while (res->next()) {
  s = res->getString(1);
  cout << s << endl;
 }
}

给出这个:

a^@
a^@
a^@
a^@

最佳答案

我真的不知道你的问题是否和我的一样。 我试图使用 PHP 和 MySQL 数据库从 utf8_bin 数据库获取搜索结果,但 utf8_bin 在谈论相似字符(如 e é ë)时非常严格。因此,当在没有正确的 utf8 字符和/或大小写的情况下使用查询时,它不会返回结果或至少不会返回预期的结果。因此,我的 Oracle 谷歌在 MySQL 文档中显示了我使用 _utf8(注意下划线)和在 SELECTS 的 WHERE 子句中使用 collat​​e utf8_unicode_ci 的解决方案:

SELECT field1,field2,field3
FROM `table1`
WHERE `table`.`field2` LIKE _utf8 '%$q%' collate utf8_unicode_ci

希望它能解决您的问题。 P.S.:对不起我的英语。这不是我的母语。

关于c++ - odbc 客户端无法从 MySQL DB 读取 utf8 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4843169/

相关文章:

c++ - Visual Studio 中的 OpenGL - GLEW 的问题

mysql 无法更改 session 变量 group_concat_max_len

MySQL 在带有别名/前缀的表上左连接两次

java - 为 Hadoop 作业指定 UTF-8 编码

ruby-on-rails - 当我需要 UTF-8 时,Rails 应用程序一直以 ASCII-8BIT 生成 View ?

c++ - boost 返回 0 的 CPU 时间

c++ - 无法编译代码,因为它在 C++11 中已弃用

c++ - 将 read() 内容传递给 C++ 字符串类型

PHP 文件无法连接到 MySQL Android Studio 登录/注册应用程序

security - UTF-8 字符编码是否会对 Web 应用程序造成任何安全隐患?