环境:
mysql5.0,设置向导中的字符集编码是默认的latin1;
刷库脚本没有任何字符集的指定;
现象:
在mysql控制台中导入刷库脚本和预置数据,在mysql控制台中查询,显示中文,在我的web应用中,连接设置未加字符集编码指定,sql作gbk转iso,查询结果作iso转gbk,都是正常的中文。
在sqlyog或mysql-front工具导入同样的刷库脚本(连接字符串没有设置字符集),导入后在sqlyog里查出来即是乱码,web应用查出来,也是乱码。
尝试:
经查询,得知mysql控制台的字符集环境为:
+--------------------------+--------+
| 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   |
+--------------------------+--------+
然后sqlyog的字符集环境为:
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | utf8   |
| character_set_connection | utf8   |
| character_set_database   | latin1 |
| character_set_results    | utf8   |
| character_set_server     | latin1 |
| character_set_system     | utf8   |
+--------------------------+--------+
我在sqlyog里导入刷库脚本前,强制用sql语句把字符集环境调成和mysql控制台一样的,结果还是乱码。
上述努力失败后,我在刷库脚本的预置数据insert语句前添加set charset gbk/utf8,也还是乱码。
除去sqlyog,mysql-front也一样,乱码。
请教:
如何在不修改mysql配置的情况下,用sqlyog导入这些刷库脚本而不出乱码呢?(web服务要部署于第三方环境,该环境下的mysql实例不一定允许我改配置,很可能就是latin1的,而且我需要一款第三方工具来远程导入)先谢谢各位。

解决方案 »

  1.   

    检查一下表中的源来字符集是什么。http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
    MySQL 中文显示乱码
      

  2.   

    谢谢楼上两位前辈的帮助。进度:
    set names 'gbk';
    set charset latin1; DROP DATABASE IF EXISTS user_test;
    CREATE DATABASE user_test;
    USE user_test;
    CREATE TABLE `user` (
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      `name` VARCHAR(20) NOT NULL,  
      `age` int,
      PRIMARY KEY (`id`)
    ) ENGINE=INNODB;
    insert into user value(1, '李明', 22);
    以上是作测试用的sql。
    *如果在mysql-front中首先执行“set names latin1; ”(2楼的方法),再执行建表与导入数据,mysql控制台查询结果仍为乱码。*如果在新打开的mysql-front中首先执行“set names 'gbk';set charset latin1; ”这两句,再执行建表与导入数据,mysql控制台查询结果就正常了。*如果在新打开的mysql-front中执行上述所有脚本,mysql控制台查询结果为乱码,再执行第二遍之后,mysql控制台查询结果就正常了。
    1楼版主建议我的几篇精华帖,我都看了一遍,初步了解了数据库连接编码、客户端编码、数据库实例返回时的转码设置,与乱码产生的关联。十分感谢。下面一些疑问我还是感到有些难以解释。新疑问:
    1、为何把set charset、set names这两句与预置数据分批执行,就不乱码了?
    2、set charset影响的是character_set_client、character_set_results,而set names影响的是character_set_client、character_set_results、character_set_connection,而我先执行set charset 'gbk',把character_set_client、character_set_results改成了gbk,紧接第二句set charset latin1把character_set_client、character_set_results、character_set_connection都改成了latin1,那么直接执行set charset latin1,对连接、客户端、返回这三处编码的修改就已经达到目的,为何在不执行第一句set charset 'gbk'的情况下,导入结果仍为乱码呢?
      

  3.   

    最新进展:
    在sqlyog、navicat里使用
    set names 'gbk';
    set charset latin1; 
    也不行,目前又回到原点了,在任何第三方工具里导入脚本,结果都是乱码。
     
      

  4.   

    现在改为使用sqlyog,感觉和mysql front差不多,在sqlyog的查询窗口里执行:
    set names xxx;
    set charset xxx; 
    SET character_set_client = xxx;
    SET character_set_results = xxx;
    SET character_set_connection = xxx;
    等语句后,使用show variables like '%char%';可看到相关编码确实被修改,但从目前我的测试结果来看,我怀疑在mysql front或sqlyog里执行上述语句对于mysql front或sqlyog本身是没用的,无论是insert还是select,同样的语句在mysql控制台里导入,可查出中文,而在这两个工具里导入查询,或者由mysql控制台导入由工具查询,一律都是乱码,mysql front或sqlyog内部始终用某一种字符集与mysql进行交互。mysql的配置使用默认的latin1,不能用ut8,配置文件不可改,sql语句可改,解决方案只有围绕sql建表语句和字符集设置语句展开。ACMAIN_CHM前辈,俺真没辙了,向您求助。
      

  5.   

    检查导出SQL文件的字符集是什么
      

  6.   


    您好,检查结果如下:一、mysql控制台的检查结果:
    1、show create table user;--------------------------------------------------+
    | Table | Create Table
                                                     |
    +-------+----------------------------------------------------------------------------------------------+
    | user  | CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) NOT NULL,
      `age` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=lati
    +-------+--------------------------------------------
    2、show full columns from user;+-------+-------------+-------------------+------+-----+---------+--------------
    --+---------------------------------+---------+
    | Field | Type        | Collation         | Null | Key | Default | Extra
      | Privileges                      | Comment |
    +-------+-------------+-------------------+------+-----+---------+--------------
    --+---------------------------------+---------+
    | id    | int(11)     | NULL              | NO   | PRI | NULL    | auto_incremen
    t | select,insert,update,references |         |
    | name  | varchar(20) | latin1_swedish_ci | NO   |     | NULL    |
      | select,insert,update,references |         |
    | age   | int(11)     | NULL              | YES  |     | NULL    |
      | select,insert,update,references |         |
    +-------+-------------+-------------------+------+-----+---------+--------------
    --+---------------------------------+---------+
    3、show variables like 'char%';+--------------------------+----------------------------------------------------
    -----+
    | Variable_name            | Value
         |
    +--------------------------+----------------------------------------------------
    -----+
    | character_set_client     | latin1
         |
    | character_set_connection | latin1
         |
    | character_set_database   | latin1
         |
    | character_set_filesystem | binary
         |
    | character_set_results    | latin1
         |
    | character_set_server     | latin1
         |
    | character_set_system     | utf8
         |
    | character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.1\share\chars
    ets\ |
    +--------------------------+----------------------------------------------------
    -----+二、sqlyog中的检查结果:
    1、show create table user;Table Create Tableuser CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) NOT NULL,
      `age` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    2、show full columns from user;Field Type Collation Null Key Default Extra Privileges
    Comment
    id int(11) \N NO PRI \N auto_increment select,insert,update,references name varchar(20) latin1_swedish_ci NO \N select,insert,update,references age int(11) \N YES \N select,insert,update,references 3、show variables like 'char%';Variable_name Valuecharacter_set_client utf8character_set_connection utf8character_set_database latin1character_set_filesystem binarycharacter_set_results utf8character_set_server latin1character_set_system utf8character_sets_dir C:\\Program Files\\MySQL\\MySQL Server 5.1\\share\\charsets\\
      

  7.   

    sql文件是手写的,字符集是ANSI(win7中文版下为GB2312)。
      

  8.   

    用WORD、ULTRAEDIT之类的软件打开此SQL文件,有无提示,最好在统一的字符集下
    重新建立库、表,再导入数据
      

  9.   

    在ue里看,我那个sql文件是utf-16的,我刚刚用ue新建了一个gbk的sql脚本文件,在sqlyog复制gbk版sql脚本文件的内容进行导入,导入前使用了“set names latin1”,导入后依旧乱码。