我有一个带有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^@
答案 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为模型的,所以变化并不大。希望我不会很快改变数据库...