› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
Qiangyuan
V2EX  ›  MySQL

项目全程都是 utf8, mysql 还是出现中文乱码

  •  1
     
  •   Qiangyuan · May 17, 2015 · 5309 views
    This topic created in 4148 days ago, the information mentioned may be changed or developed.

    项目全程都是utf8,hibernte写进数据库的数据取出来在myeclipse的consle下面显示是正常的,为何在数据库那个dos窗口下面显示的中文名就是乱码。注明:我的数据库所有配置都是utf8
    然后我又试着手动在dos窗口下用insert语句插入中文,结果是error1406,插不进去,再查看用程序插进去的中文显示乱码。
    之后的解决方法:我把my.ini文件中的两处配置改为GBK,然后dos窗口下显示出了正确的中文,我想问的是既然数据库是utf8编码,为何GBK可以把中文读出来,utf8就不行,是不是dos窗口中不支持utf8的显示,所以中文乱码?

    Supplement 1  ·  May 17, 2015
    想了一下,差不多应该就是DOS窗口的显示问题了,现在用数据库就用图形化来管理操作了,如果要用命令提示符操作的话,就只能先set names gbk;然后不用了就输入一句set names utf8;之所以这么切换是因为我想保持所有的都为utf8方式,避免可能出现的麻烦,这应该就是目前的解决办法吧。
    --------------------------------------------------------------------------------------------------------------------

    希望有遇到过此问题的人能说一下你们的解决办法
    Supplement 2  ·  May 17, 2015
    MySQL命令行输入“SET NAMES UTF8;”
    面那句等于:
    SET character_set_client = utf8;
    SET character_set_results = utf8;
    SET character_set_connection = utf8
    mysql中的运行模式为
    信息输入路径:client→connection→server;
    信息输出路径:server→connection→results。
    换句话说,以出现乱码的输出为例,server里utf8的数据,传入connection,传入results依旧为utf8,dos窗口把results转过来。如果两种字符集不兼容,比如gbk和utf8,转化过程就为不可逆的,破坏性的,所以会出线乱码。
    再来看不出现乱码的情况,每个路径要经过3次改变字符集编码。server里utf8的数据,传入connection转为gbk,传入results,编码方式依旧为GBK,DOS窗口把results转过来,dos默认是GBK编码方式,这就是相同的了,就不会出现乱码。
    所以我之前总是error1406,插入不进包含中文的sql语句,也就是这个道理。
    另外,我的数据库编码方式,我在创建的时候就设定为了utf8了,所以我的数据库的编码方式为utf8,那么我其他的工具读取的时候就不会有错。
    这就是为什么每次一乱码,输入一句set names gbk(对于dos窗口),或者输入一句set names utf8(对于页面等以utf8编码的东西),乱码就消失了的原因吧

    这是我的理解不知道分析的对不对,不对的希望有人可以指出
    10 replies  •  2015-05-17 13:23:29 +08:00
    Septembers
        1
    Septembers  
       May 17, 2015 via Android
    cmd的codepage是跟系统走的
    jokester
        2
    jokester  
       May 17, 2015
    cmd那个编码坑了多少人..
    reeco
        3
    reeco  
       May 17, 2015 via iPhone
    用图形化管理工具
    wy315700
        4
    wy315700  
       May 17, 2015   ❤️ 1
    开发别用Windows了吧,坑特别多。

    CMD算一个,还有文件名不区分大小写
    ctexlive
        5
    ctexlive  
       May 17, 2015 via Android
    win命令终端默认显示gbk编码。可以通过转换把utf8转成GBK输出到终端。…… 参考git for win的解决
    msg7086
        6
    msg7086  
       May 17, 2015
    纠正一下。那个叫命令提示符,不是DOS窗口。DOS窗口早在10多年前就被淘汰了。
    Qiangyuan
        7
    Qiangyuan  
    OP
       May 17, 2015
    @reeco 我又将所有配置改为utf8
    | character_set_client | utf8
    |
    | character_set_connection | utf8
    |
    | character_set_database | utf8
    |
    | character_set_filesystem | binary
    |
    | character_set_results | utf8
    |
    | character_set_server | utf8
    |
    | character_set_system | utf8
    |
    然后在图形化管理工具里查询下,确实中文都是正确的,但dos下查询就又都是乱码了,那是不是不管了呢,整个项目都是统一utf8编码,只有在dos下操作才会乱码,我怕改了my.ini配置,虽然可以显示中文,但感觉要用就统一用utf8,把一部分给位GBK,说不定会造成后面开发进程可能出现的问题,所以我感觉这应该就是dos窗口编码显示的问题吧
    @ctexlive
    Qiangyuan
        8
    Qiangyuan  
    OP
       May 17, 2015
    @msg7086 恩,谢谢分享,知道了
    SoloCompany
        9
    SoloCompany  
       May 17, 2015
    方法1
    改 mysql.cnf 让 client 使用 GB18030 编码, 或者在 mysql 命令行中输入 mysql set names gb18030 (如果不支持则改成 gbk)

    方法2
    在 cmd shell 里面输入
    chcp 65001


    最后的建议
    少用 windows 干这事
    Qiangyuan
        10
    Qiangyuan  
    OP
       May 17, 2015
    @SoloCompany set names 'gbk' 对应的是三条语句,我试着运行了一下set character_set_client=utf8,还是乱码,但是运行set names 'gbk' ,就正常了,但是同时里面的 character_set_connection也变成了GBK了,这会不会影响呢?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   850 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 21:13 · PVG 05:13 · LAX 14:13 · JFK 17:13
    ♥ Do have faith in what you're doing.