我是在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中查询时发现里面同样还是乱码,中文都变成了"?",求解。在线等待...

解决方案 »

  1.   

    参考下贴中的方法,贴出你的检查结果。
    http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
    MySQL 中文显示乱码
      

  2.   

    帮你UP下 ~你看下1L给出的链接 好好看看 
      

  3.   

    其中的各项参数如下:mysql> show create table testemail;
    +-----------+-----------------------------------------------------------------------------------------------------+
    | 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> 
      

  4.   

    select abstrac, hex(abstrac)  from testemail;贴两条出来对比一下,另外建议你把正确的汉字也贴出来。
      

  5.   


    [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> 
      

  6.   

    set names 'gb2312';
    试一下。
      

  7.   


    其实我在程序连接上数据库后执行操作前已经执行了这名话了,上面的输出也打印出来了:if(mysql_query(&mysql, "SET NAMES gb2312"))
        {
            printf("mysql_query() error: %s\n", mysql_error(&mysql));
            mysql_close(&mysql);
            return -1;
        }
      

  8.   

    “SET NAMES gb2312”和“SET NAMES 'gb2312'”都试过了,一样的效果
      

  9.   

    不是在C中,而直接在
    mysql>  set name 'gb2312';
      

  10.   

    你先大概看下这篇文章
    http://www.chinaz.com/Program/Mysql/05262c342008.html
    然后建议你从下面两个思路开始排查:
    ①c语言连接mysql可以指定编码吗?python连接mysql的库可以指定,我想着c语言也应该可以指定.
    我看你的代码中没有指定,你调查你用的连接库会不会默认是utf8什么的?
    ②你当前文件是什么编码,插入前是否需要转码?python中可以在脚本的开头指定--charset--你核对一下。有消息了给我发个消息,我以前用python连接的时候就出现这个问题,大致就是按照上面的思路解决的,没有用c连过,所以没有办法测试;对这个问题也比较感兴趣。
      

  11.   

    对了,不是在连接之后执行 set name 'gb2312';,而是在连接的参数中指定。MySQLdb的connect方法中有
      

  12.   

    谢谢各位的热情,看了好多文章,可是依然没有什么效果,最后只能把那一列的编码改为latin1,然后再稍微修改一下sql语句的编码方式就可以正确显示中文了,虽然用其它方法解决了,遗憾的是用gb2312仍然没有成功。