设为首页 收藏本站
查看: 724|回复: 0

[经验分享] mysql字符集乱码问题

[复制链接]

尚未签到

发表于 2018-10-9 12:44:16 | 显示全部楼层 |阅读模式
  MySQL处理连接时,外部连接发送过来的SQL请求会根据以下顺序进行转换:
  character_set_client           //客户连接所采用的字符集
  |
  character_set_connection  //MySQL连接字符集
  |
  character_set_database    //数据库所采用的字符集(表,列)
  |
  character_set_results        //客户机显示所采用的字符集
  一. 产生乱码的根本原因在于:
  1.客户机没有正确地设置client字符集,导致原先的SQL语句被转换成connection所指字符集,而这种转换,是会丢失信息的,如果client是utf8格式,那么如果转换成gb2312格式,这其中必定会丢失信息,反之则不会丢失。一定要保证connection的字符集大于client字符集才能保证转换不丢失信息。
  2. 数据库字体没有设置正确,如果数据库字体设置不正确,那么connection字符集转换成database字符集照样丢失编码,原因跟上面一样。
  二.为什么set names 'gb2312'就可以了呢
  set names 'gb2312'相当于这三条语句:
  set character_set_client = gb2312;
  set character_set_connection = gb2312;
  set character_set_results = gb2312;
  这样做的话,上述产生乱码的原因1就不存在了,因为编码格式都统一了,但是这样做并不是万金油。原因有:
  1.你的client不一定是用gb2312编码发送SQL的,如果编码不是gb2312那么转换成gb2312就会产生问题。
  2.你的数据库中的表不一定是gb2312格式,如果不是gb2312格式而是其他的比如说latin1,那么在存储字符集的时候就会产生信息丢失。
  综上,终极解决方案如下:
  1.首先要明确你的客户端时候何种编码格式,这是最重要的(IE6一般用utf8,命令行一般是gbk,一般程序是gb2312)
  2.确保你的数据库使用utf8格式,很简单,所有编码通吃。
  3.一定要保证connection字符集大于等于client字符集,不然就会信息丢失,比如latin1 show variables like '%character%';
  +--------------------------+--------------------------------+
  | Variable_name            | Value                          |
  +--------------------------+--------------------------------+
  | character_set_client     | latin1                         |
  | character_set_connection | latin1                         |
  | character_set_database   | utf8                           |
  | character_set_filesystem | binary                         |
  | character_set_results    | latin1                         |
  | character_set_server     | utf8                           |
  | character_set_system     | utf8
  每次查询前设置查询结果集编码为utf8 即set character_set_results=utf8  
  解决Mysql导入乱码问题
  方法一: 通过增加参数 –default-character-set = utf8 解决乱码问题
  C:\Users\Administrator>mysql -uroot -p yktgl < F:\YIKATONG\application\gl.sql --default-character-set=utf8
  方法二: 在命令行导入乱码解决
  1.mysql>use gl;
  2.mysql> set names utf8;
  3.mysql>source example.sql
  mysql -u root -p --default-character-set=utf8
  use dbname
  source /root/newsdata.sql
  方法三: 直接粘贴sql文件里的代码
  1. 打开SQLyog客户端软件;
  2. 定位到SQL编辑器,然后用记事本打开刚刚导出的SQL文件;
  3. 复制文件中所有SQL语句到SQL编辑器当中,执行这些SQL代码;
  二、导出数据
  mysqldump -u root -p --default-character-set=utf8 gl> gl.sql
  定义编码导入
  mysql -u root -p --default-character-set=utf8 -f discuss_chi 如还是乱码使用二进导入
  mysql -u root -p --default-character-set=binary -f discuss_chi dis.sql
  导入
  mysql -u root -p --default-character-set=binary -f discuss_chi
  统一字符集保证不乱码:建议中英文环境选择utf8
  1.linux系统语言
  /etc/sysconfig/i18n
  LANG="zh_CN.utf8"
  2.mysql客户端
  临时:
  set names utf8;
  永久:
  配置文件my.cnf
  [client]
  default-charater-set=utf8
  3.mysql服务端
  [mysqld]
  character-set-server=utf8
  4.mysql建库建表语句
  指定字符集建库
  create database oldboy_utf8 default character set uft8 collate utf8_general_ci;
  指定字符集建表
  create table student (
  id int(4) not null auto_increment,
  name char(20) not null,
  primary key(id)
  )engine=inonodb auto_increment=10 default charset=utf8
  5.开发程序的字符集
  模拟将latin1字符集的数据库修改成GBK字符集的实际过程
  1.导出表结构
  mysqldump -uroot -p --default-character-set=latin1 -d dbname >alltatale.sql
  --default-character-set=latin1 以latin1连接 -d只导表结构
  2.编辑alltable.sql将latin1改成gbk
  sed替换
  3.确保数据库不在更新,导出所有数据
  mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 dbname >alldata.sql
  4.打开alldata.sql将set names latin1修改成set names gbk;(或者修改系统的服务端和客户端)
  5.建库
  create database dbname default charset bgk;
  6.创建表,执行alltable.sql
  mysql -uroot -p dbname SET character_set_client = utf8 ;
  mysql> SET character_set_connection = utf8 ;
  mysql> SET character_set_database = utf8 ;
  mysql> SET character_set_results = utf8 ;
  mysql> SET character_set_server = utf8 ;
  mysql> SET collation_connection = utf8 ;
  mysql> SET collation_database = utf8 ;
  mysql> SET collation_server = utf8 ;
  有时候设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,存入数据库的仍然是乱码。那connection连接层上可能出了问题。
  解决方法是在发送查询前执行一下下面这句: SET NAMES 'utf8';它相当于下面的三句指令:
  SET character_set_client = utf8;
  SET character_set_results = utf8;
  SET character_set_connection = utf8;
  注意:具体的参数和MySQL的安装方式以及版本有密切关系,比较成熟的版本默认字符集是utf-8,当然具体怎么定义,可参考官方文档。
  ###################################################################
  第二问:查看MySQL默认字符集(默认情况下,mysql的字符集是latin1)
  通常,查看系统的字符集和排序方式的设定可以通过下面的两条命令:
  SHOW VARIABLES LIKE 'character%';
  SHOW VARIABLES LIKE 'collation_%';
  ###################################################################
  第三问:传统的程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?
  (1)编译MySQL 时,指定了一个MySQL默认的字符集,这个字符集是 latin1;
  (2)安装MySQL 时,可以在配置文件 (my.cnf,或者my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
  (3)启动mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;
  (4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;
  (5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
  (6)在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
  (7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;
  简单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用 latin1 存储,不过我们如果安装 MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把 default_character_set 设置为 UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用 UTF-8 存储。
  ###################################################################
  第四问:还有什么情况下会由于MySQL的原因导致乱码?
  这种情况可能和使用高可用软件或者插件导致的,比如mysql-proxy等
  例子:mysql proxy 乱码问题
  有时候通过proxy连上数据库之后,查到的字符串始终是乱码,即便手工执行了set names ‘utf8′也没有效果。
  解决办法,mysql server必须设置
  修改my.cnf文件
  [mysqld]
  skip-character-set-client-handshake
  init-connect='SET NAMES utf8'
  default-character-set=utf8
  ###################################################################
  第五问:什么原因还会导致乱码问题?
  1、浏览器问题
  2、代理问题
  3、代码字符集问题
  4、数据库代理字符集问题
   show variables like '%char%';
  +--------------------------+-------------------------------------+------
  | Variable_name            | Value                               |......
  +--------------------------+-------------------------------------+------
  | 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                                |......
  | character_sets_dir       | D:\MySQL Server 5.0\share\charsets\ |......
  +--------------------------+-------------------------------------+------
  二、查看 MySQL 数据表(table) 的字符集
  mysql> show table status from sqlstudy_db like '%countries%';
  +-----------+--------+---------+------------+------+-----------------+------
  | Name      | Engine | Version | Row_format | Rows | Collation       |......
  +-----------+--------+---------+------------+------+-----------------+------
  | countries | InnoDB |      10 | Compact    |   11 | utf8_general_ci |......
  +-----------+--------+---------+------------+------+-----------------+------
  三、查看 MySQL 数据列(column)的字符集
  mysql> show full columns from countries;
  +----------------------+-------------+-----------------+--------
  | Field                | Type        | Collation       | .......
  +----------------------+-------------+-----------------+--------
  | countries_id         | int(11)     | NULL            | .......
  | countries_name       | varchar(64) | utf8_general_ci | .......
  | countries_iso_code_2 | char(2)     | utf8_general_ci | .......
  | countries_iso_code_3 | char(3)     | utf8_general_ci | .......
  | address_format_id    | int(11)     | NULL            | .......
  +----------------------+-------------+-----------------+--------
  四、查看当前安装的 MySQL 所支持的字符集
  mysql> show charset;
  +----------+-----------------------------+---------------------+--------+
  | Charset | Description                 | Default collation   | Maxlen |
  +----------+-----------------------------+---------------------+--------+
  | big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
  | dec8     | DEC West European           | dec8_swedish_ci     |      1 |
  | cp850    | DOS West European           | cp850_general_ci    |      1 |
  | hp8      | HP West European            | hp8_english_ci      |      1 |

  | koi8r    | KOI8-R>  | latin1   | cp1252 West European        | latin1_swedish_ci   |      1 |
  | latin2   | ISO 8859-2 Central European | latin2_general_ci   |      1 |
  | swe7     | 7bit Swedish                | swe7_swedish_ci     |      1 |
  | ascii    | US ASCII                    | ascii_general_ci    |      1 |
  | ujis     | EUC-JP Japanese             | ujis_japanese_ci    |      3 |
  | sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |      2 |
  | hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |      1 |
  | tis620   | TIS620 Thai                 | tis620_thai_ci      |      1 |
  | euckr    | EUC-KR Korean               | euckr_korean_ci     |      2 |
  | koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |      1 |
  | gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |      2 |
  | greek    | ISO 8859-7 Greek            | greek_general_ci    |      1 |
  | cp1250   | Windows Central European    | cp1250_general_ci   |      1 |
  | gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |      2 |
  | latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |      1 |
  | armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |      1 |
  | utf8     | UTF-8 Unicode               | utf8_general_ci     |      3 |
  | ucs2     | UCS-2 Unicode               | ucs2_general_ci     |      2 |
  | cp866    | DOS Russian                 | cp866_general_ci    |      1 |
  | keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci |      1 |
  | macce    | Mac Central European        | macce_general_ci    |      1 |
  | macroman | Mac West European           | macroman_general_ci |      1 |
  | cp852    | DOS Central European        | cp852_general_ci    |      1 |
  | latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |      1 |
  | cp1251   | Windows Cyrillic            | cp1251_general_ci   |      1 |
  | cp1256   | Windows Arabic              | cp1256_general_ci   |      1 |
  | cp1257   | Windows Baltic              | cp1257_general_ci   |      1 |
  | binary   | Binary pseudo charset       | binary              |      1 |
  | geostd8 | GEOSTD8 Georgian            | geostd8_general_ci |      1 |
  | cp932    | SJIS for Windows Japanese   | cp932_japanese_ci   |      2 |
  | eucjpms | UJIS for Windows Japanese   | eucjpms_japanese_ci |      3 |
  +----------+-----------------------------+---------------------+--------+
  以上查看 MySQL 字符集命令,适用于 Windows & Linux
  Liunx下修改MySQL字符集:
  1.查找MySQL的cnf文件的位置
  find / -iname '*.cnf' -print
  /usr/share/mysql/my-innodb-heavy-4G.cnf
  /usr/share/mysql/my-large.cnf
  /usr/share/mysql/my-small.cnf
  /usr/share/mysql/my-medium.cnf
  /usr/share/mysql/my-huge.cnf
  /usr/share/texmf/web2c/texmf.cnf
  /usr/share/texmf/web2c/mktex.cnf
  /usr/share/texmf/web2c/fmtutil.cnf
  /usr/share/texmf/tex/xmltex/xmltexfmtutil.cnf
  /usr/share/texmf/tex/jadetex/jadefmtutil.cnf
  /usr/share/doc/MySQL-server-community-5.1.22/my-innodb-heavy-4G.cnf
  /usr/share/doc/MySQL-server-community-5.1.22/my-large.cnf
  /usr/share/doc/MySQL-server-community-5.1.22/my-small.cnf
  /usr/share/doc/MySQL-server-community-5.1.22/my-medium.cnf
  /usr/share/doc/MySQL-server-community-5.1.22/my-huge.cnf
  2. 拷贝 small.cnf、my-medium.cnf、my-huge.cnf
  my-innodb-heavy-4G.cnf,其中的一个到/etc下命名为my.cnf
  cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
  3. 修改my.cnf
  vi /etc/my.cnf
  在[client]下添加
  default-character-set=utf8
  在[mysqld]下添加
  default-character-set=utf8
  4.重新启动MySQL
  [root@bogon ~]# /etc/rc.d/init.d/mysql restart
  Shutting down MySQL                                         [ 确定 ]
  Starting MySQL.                                                  [ 确定 ]
  [root@bogon ~]# mysql -u root -p
  Enter password:
  Welcome to the MySQL monitor. Commands end with ; or \g.

  Your MySQL connection>  Server version: 5.1.22-rc-community-log MySQL Community Edition (GPL)
  Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
  其他的一些设置方法:
  修改数据库的字符集
  mysql>use mydb
  mysql>alter database mydb character set utf-8;
  创建数据库指定数据库的字符集
  mysql>create database mydb character set utf-8;
  通过配置文件修改:
  修改/var/lib/mysql/mydb/db.opt
  default-character-set=latin1
  default-collation=latin1_swedish_ci
  为
  default-character-set=utf8
  default-collation=utf8_general_ci
  重起MySQL:
  [root@bogon ~]# /etc/rc.d/init.d/mysql restart
  通过MySQL命令行修改:
  mysql> set character_set_client=utf8;
  Query OK, 0 rows affected (0.00 sec)
  mysql> set character_set_connection=utf8;
  Query OK, 0 rows affected (0.00 sec)
  mysql> set character_set_database=utf8;
  Query OK, 0 rows affected (0.00 sec)
  mysql> set character_set_results=utf8;
  Query OK, 0 rows affected (0.00 sec)
  mysql> set character_set_server=utf8;
  Query OK, 0 rows affected (0.00 sec)
  mysql> set character_set_system=utf8;
  Query OK, 0 rows affected (0.01 sec)
  mysql> set collation_connection=utf8;
  Query OK, 0 rows affected (0.01 sec)
  mysql> set collation_database=utf8;
  Query OK, 0 rows affected (0.01 sec)
  mysql> set collation_server=utf8;
  Query OK, 0 rows affected (0.01 sec)
  .sql


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-619612-1-1.html 上篇帖子: mysql文件备份 下篇帖子: mysql几种性能测试的工具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表