我是在linux下用c写的程序操作mysql的。在show create table时显示的charset=gb2312,因而我在插入中文数据的时候,在mysql_real_connect成功后立刻执行mysql_query来设置字符集,代码如下: if(mysql_real_connect(&mysql, ip.sHost, ip.sUser, ip.sPwd, ip.sName, 0, NULL, 0) == NULL)
{
printf("mysql connect error:%s!\n", mysql_error(&mysql));
return -1;
}
/* */
if(mysql_query(&mysql, "SET NAMES gb2312"))
{
printf("mysql_query() error: %s\n", mysql_error(&mysql));
mysql_close(&mysql);
return -1;
}
然后再执行mysql_query的插入语句,但是在mysql中查询时发现里面同样还是乱码,中文都变成了"?",求解。在线等待...
{
printf("mysql connect error:%s!\n", mysql_error(&mysql));
return -1;
}
/* */
if(mysql_query(&mysql, "SET NAMES gb2312"))
{
printf("mysql_query() error: %s\n", mysql_error(&mysql));
mysql_close(&mysql);
return -1;
}
然后再执行mysql_query的插入语句,但是在mysql中查询时发现里面同样还是乱码,中文都变成了"?",求解。在线等待...
http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
MySQL 中文显示乱码
+-----------+-----------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------+-----------------------------------------------------------------------------------------------------+
| testemail | CREATE TABLE `testemail` (
`email` text,
`abstract` text
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 |
+-----------+-----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)mysql> show full columns from testemail;
+----------+------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+----------+------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| email | text | gb2312_chinese_ci | YES | | NULL | | select,insert,update,references | |
| abstract | text | gb2312_chinese_ci | YES | | NULL | | select,insert,update,references | |
+----------+------+-------------------+------+-----+---------+-------+---------------------------------+---------+
2 rows in set (0.01 sec)mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)mysql>
[root@email guest]# ./import yuanlingdao.txt 院领导
set names 'gb2312'
success: update testemail set abstract = "院领导" where email = "[email protected]"
success: update testemail set abstract = "院领导" where email = "[email protected]"
mysql> select abstract, hex(abstract) from testemail;
+----------+---------------+
| abstract | hex(abstract) |
+----------+---------------+
| ??? | D4BAC1ECB5BC |
| ??? | D4BAC1ECB5BC |
+----------+---------------+
9 rows in set (0.00 sec)mysql>
试一下。
其实我在程序连接上数据库后执行操作前已经执行了这名话了,上面的输出也打印出来了:if(mysql_query(&mysql, "SET NAMES gb2312"))
{
printf("mysql_query() error: %s\n", mysql_error(&mysql));
mysql_close(&mysql);
return -1;
}
mysql> set name 'gb2312';
http://www.chinaz.com/Program/Mysql/05262c342008.html
然后建议你从下面两个思路开始排查:
①c语言连接mysql可以指定编码吗?python连接mysql的库可以指定,我想着c语言也应该可以指定.
我看你的代码中没有指定,你调查你用的连接库会不会默认是utf8什么的?
②你当前文件是什么编码,插入前是否需要转码?python中可以在脚本的开头指定--charset--你核对一下。有消息了给我发个消息,我以前用python连接的时候就出现这个问题,大致就是按照上面的思路解决的,没有用c连过,所以没有办法测试;对这个问题也比较感兴趣。