【发布时间】: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