V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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 · 2015-05-17 12:19:58 +08:00 · 4348 次点击
    这是一个创建于 3272 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    希望有遇到过此问题的人能说一下你们的解决办法
    第 2 条附言  ·  2015-05-17 13:56:03 +08:00
    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 条回复    2015-05-17 13:23:29 +08:00
    Septembers
        1
    Septembers  
       2015-05-17 12:25:13 +08:00 via Android
    cmd的codepage是跟系统走的
    jokester
        2
    jokester  
       2015-05-17 12:29:53 +08:00
    cmd那个编码坑了多少人..
    reeco
        3
    reeco  
       2015-05-17 12:34:37 +08:00 via iPhone
    用图形化管理工具
    wy315700
        4
    wy315700  
       2015-05-17 12:36:22 +08:00   ❤️ 1
    开发别用Windows了吧,坑特别多。

    CMD算一个,还有文件名不区分大小写
    ctexlive
        5
    ctexlive  
       2015-05-17 12:36:35 +08:00 via Android
    win命令终端默认显示gbk编码。可以通过转换把utf8转成GBK输出到终端。…… 参考git for win的解决
    msg7086
        6
    msg7086  
       2015-05-17 12:52:07 +08:00
    纠正一下。那个叫命令提示符,不是DOS窗口。DOS窗口早在10多年前就被淘汰了。
    Qiangyuan
        7
    Qiangyuan  
    OP
       2015-05-17 12:53:25 +08:00
    @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
       2015-05-17 12:54:42 +08:00
    @msg7086 恩,谢谢分享,知道了
    SoloCompany
        9
    SoloCompany  
       2015-05-17 13:13:06 +08:00
    方法1
    改 mysql.cnf 让 client 使用 GB18030 编码, 或者在 mysql 命令行中输入 mysql set names gb18030 (如果不支持则改成 gbk)

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


    最后的建议
    少用 windows 干这事
    Qiangyuan
        10
    Qiangyuan  
    OP
       2015-05-17 13:23:29 +08:00
    @SoloCompany set names 'gbk' 对应的是三条语句,我试着运行了一下set character_set_client=utf8,还是乱码,但是运行set names 'gbk' ,就正常了,但是同时里面的 character_set_connection也变成了GBK了,这会不会影响呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2029 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:12 · PVG 09:12 · LAX 18:12 · JFK 21:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.