环境:vc6.0,mysql5.1,mysql ODBC5.1
现象:
mysql5.1在liunx服务器上,汉字显示正常。
取出数据后,页面显示数据库取出的值表示为:??上网找了些相关资料:
建一个 ODBC 数据源,指向你的数据库,并在该数据源配置项 Initial Statement 中填入 SET CHARACTER SET GBK
问题:mysql ODBC5.1的连接中好像没有Initial Statement 项。请各位帮忙指导指导,谢谢!

解决方案 »

  1.   

    象执行 select  * from .一样,在C中执行一下 "set names 'gbk'"http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
    MySQL 中文显示乱码
      

  2.   

    +--------+----------------------------------------------------------------------------------------------------------------------------------------+
    | Common | CREATE TABLE `Common` (
      `ID` char(2) NOT NULL,
      `NM` varchar(30) NOT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=MyISAM DEFAULT CHARSET=gbk |
    +--------+----------------------------------------------------------------------------------------------------------------------------------------+
    +-------+-------------+----------------+------+-----+---------+-------+---------------------------------+---------+
    | Field | Type        | Collation      | Null | Key | Default | Extra | Privileges                      | Comment |
    +-------+-------------+----------------+------+-----+---------+-------+---------------------------------+---------+
    | ID    | char(2)     | gbk_chinese_ci | NO   | PRI | NULL    |       | select,insert,update,references |         |
    | NM    | varchar(30) | gbk_chinese_ci | NO   |     | NULL    |       | select,insert,update,references |         |
    +-------+-------------+----------------+------+-----+---------+-------+---------------------------------+---------+
    +--------------------------+----------------------------------+
    | Variable_name            | Value                            |
    +--------------------------+----------------------------------+
    | character_set_client     | gbk                              |
    | character_set_connection | gbk                              |
    | character_set_database   | utf8                             |
    | character_set_filesystem | binary                           |
    | character_set_results    | gbk                              |
    | character_set_server     | utf8                             |
    | character_set_system     | utf8                             |
    | character_sets_dir       | /opt/mysql/share/mysql/charsets/ |
    +--------------------------+----------------------------------+
    参数设置为以上,但是还是显示乱码,很头痛呀,网上提供的很多方法都尝试了,就是不行,是不是还有什么参数没有设置对呀,
    我连my.cnf的设置都填上了default-character-set=gbk ,就是不好用。
    我连接odbc的代码也贴上吧:
    CDatabase db;
    db.Open(NULL, FALSE, FALSE, "ODBC;DSN=mysqlODBC");
    请各位大侠帮忙呀!!!!!!!!
      

  3.   

    象执行 select  * from .一样,在C中执行一下 "set names 'gbk'"
      

  4.   

    mysql数据库字符集和校对规则设置需要遵循一定的规则:
    1、如果指定了字符集和校对规则,则使用指定的字符集和校对规则。
    2、如果指定了字符集没有指定校对规则,则使用指定字符集的默认校对规则。
    3、如果没有指定字符集和校对规则,则使用服务器字符集和校对规则作为数据库的字符集和校对规则。mysql数据库中的表的字符集和校对规则设置需要遵循一定的规则:
    1、如果指定了字符集和校对规则,则使用指定的字符集和校对规则。
    2、如果指定了字符集没有指定校对规则,则使用指定字符集的默认校对规则。
    3、如果没有指定字符集和校对规则,则使用服务器字符集和校对规则作为数据库的字符集和校对规则作为表的字符集和校对规则。你的这个问题不能在数据库中直接使用set names gbk因为这个是客户端和服务器之间连接使用的字符集,也不能直接在配置文件中指定字符集,因为在配置文件中直接指定的字符集只对新添加的数据有效,对现有的数据是无效的。要想更改现有的数据乱码情况,必须讲数据库中的数据导出,然后修改导出的文件中的字符集格式为gbk,然后在清空数据库(建议创建一个新的数据库创建库的时候选择字符集为gbk)在改数据库的字符集为gbk,然后在设置set names gbk,最后将修改后的字符集导入数据库就没有问题了
      

  5.   

    1、导出表结构mysqldump -uroot -p --default-character-set=gbk -d [数据库名] >dbdesc.sql注:--default-character-set=gbk 表示设置以什么字符集连接      -d  表示只导出数据表结构,不导出数据。2、手工修改dbdesc.sql中表结构定义中的字符集为新的字符集3、请确保你的表中的记录不再更新,导出所有记录mysqldump -uroot -p --opt --no-create-info --extended-insert --default-character-set=latin1 [数据库] > data.sql注:--default-character-set=latin1 现有数据库的字符集,防止导出的文件出现乱码      --opt 快速导出,对于数据非常多的库非常有用4、打开data.sql 将set names lantin1(根据情况而定) 修改成 set names gbk(新的字符集)5、使用新的字符集创建新的数据库create database [新的数据库名] default charaset gbk;6、创建表执行dbdesc.sqlmysql -uroot -p [新数据库名]< dbdesc.sql7、导入数据,执行data.sqlmysql -uroot -p [新数据库名]< data.sql
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ggs2008/archive/2010/02/02/5280504.aspx
      

  6.   

    多谢两位,但是还是没有解决问题。
    ACMAIN_CHM的方法我都试验了,如果我没有执行set names 'gbk',show variables like 'char%'的话,就不会出现'gbk'了。或者我没有理解你的意思,请再详细说。ggs2008:我在我的补充中已经贴了show create table Common以后的相关数据,说明我建表的时候已经DEFAULT CHARSET=gbk了,所以我不知道导出表结构修改还有什么意义?也请再详细说说。
      

  7.   

    不是让你在命令行工具中去 set names,而是在你的程序中
      

  8.   

    以下是我的代码:
    CString strNM;
    listNM.RemoveAll();//SQL文
    CString strSql="";
    strSql.Format(_T("SELECT nm FROM Common WHERE id like '%s"), id);
    strSql = strSql + "%'";

    //连接数据库
    CDatabase db;
    db.Open(NULL, FALSE, FALSE, "ODBC;DSN=mysqlODBC");if (!db.BeginTrans())   //开始事务  
        return;   
    try   
    {   
        CString strA=_T("set names 'gbk'");
        db.ExecuteSQL(strA);   
        db.CommitTrans(); //提交事务  
    }   
    catch(CDBException* e)   
    {   
        e->ReportError();   
        db.Rollback(); //如果出错,回滚事务  
    }CRecordset rs(&db);
    rs.Open(CRecordset::forwardOnly, _T(strSql));

    //取得返回值
    while(!rs.IsEOF())
    {
    rs.GetFieldValue("nm", strNM);
    listNM.AddTail(strNM);
            rs.MoveNext();
    }

    //关闭连接资源
    rs.Close();
    db.Close();
    /////////////////////////////////////////////
    报错:SET NAMES not allowed by driver