我有一个带有 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 子句中使用 collate 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/