【问题标题】:can't read utf8 strings from MySQL DB by an odbc clientodbc 客户端无法从 MySQL DB 读取 utf8 字符串
【发布时间】:2011-01-30 13:31:54
【问题描述】:

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

奇怪的是,到目前为止,我一直在使用默认的 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^@

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。是的,_utf8 是一个介绍人(就像这里的dev.mysql.com/doc/refman/5.1/en/charset-literal.html)。这种方法的缺点是转换是在查询执行期间完成的,非常耗时。不要担心你的英语——它不是我们大多数人的母语:)
    【解决方案2】:

    好吧,找到了罪魁祸首 - 正如编辑所说,它是 libodbc++ 库。打算给作者写信。解决方案是用 MySql C++ 连接器替换它。它们都是仿照JDBC的,所以变化不大。希望我不会很快更改数据库...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 2011-06-30
      • 1970-01-01
      • 2017-05-22
      相关资源
      最近更新 更多