无法通过odbc客户端从MySQL DB读取utf8字符串

时间:2011-01-30 13:31:55

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

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

奇怪的是,到目前为止我一直在使用默认的MySql设置,即latin1 charset,但数据实际上包含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^@

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

好吧,发现有罪 - 这是libodbc++库,正如编辑所说。写信给作者。解决方案是用MySql C ++连接器替换它。它们都是以JDBC为模型的,所以变化并不大。希望我不会很快改变数据库...