`
df274119386
  • 浏览: 55841 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

mysql 乱码问题追根溯源

阅读更多
统一字符集的方法:(以utf-8字符集为例,因为他是目前支持文字种类最广的字符集)
  1、彻底解决字符集的方法:
  要彻底解决字符集的方法就是让mysql在安装的时候就是用utf-8的字符集设定,这样可以使上面的六个关键
  点的编码都为utf-8。
  a、 在windows下安装mysql有提示可以选择字符集,我们选择utf-8就可以了。
  b、在linux下有三种安装方法,第一种是rpm包安装,这种因为我没有使用过所以没有发言权。
  第二种为可执行程序安装,这种安装因为已经被编译成了latin1这种瑞典语的字符集,所以无法完全解决字
  符集问题,这个版本我们后面会讲到怎么解决字符集问题。
  第三种为源码自行编译安装,这种安装可以在编译时设置字符集类型,这部分主要讲这种安装方式。
  在编译mysql是我们可以用这样的指令:./configure --default-character-set=utf8
  这样,在编译的时候,就会把mysql的server项编译成utf8的编码,这样这个mysql下建立的所有数据库都将使用utf8
  编码存储,所有有关的方面都是utf8编码。
  2、局部坚决字符集的方法:
  如果遇到自己的数据库使用的是默认安装的latin1字符集的(很奇怪为什么mysql要使用这么个默认字符集)
  的情况我们可以这样来解决。
  a、默认请况下我们在mysql命令行使用status指令察看状态,可以看到如下内容:
  mysql> status
  --------------
  mysql  Ver 14.7 Distrib 4.1.9, for pc-linux-gnu (i686)
  Connection id:          62
  Current database:
  Current user:           root@localhost
  SSL:                    Not in use
  Current pager:          stdout
  Using outfile:          ''
  Using delimiter:        ;
  Server version:         5.1.11-beta-log
  Protocol version:       10
  Connection:             Localhost via UNIX socket
  Server characterset:    latin1
  Db     characterset:latin1
  Client characterset:latin1
  Conn.  characterset:    latin1
  UNIX socket:            /tmp/mysql.sock
  Uptime:                 58 min 23 sec
  Threads: 2  Questions: 1067  Slow queries: 0  Opens: 0  Flush tables: 1  Open tables: 75  Queries per second avg: 0.305
  --------------
  还可以用SHOW VARIABLES LIKE 'character_set_%';指令察看内容如下:
  +--------------------------+---------------------------------------------------------------------------+
  | 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       | /usr/local/src/mysql-5.1.11-beta-linux-i686-glibc23/share/mysql/charsets/ |
  +--------------------------+---------------------------------------------------------------------------+
  8 rows in set (0.00 sec)
  这就说明,除system是utf8之外的所有内容的字符集都为latin1,我们怎么样才能使用utf字符集呢?
  有人说可以在my.cnf文件的[mysqld]段中加入default-character-set=utf8这一项就可以解决,但经过我的实验,这一条
  完全没有必要,以下是增加了这一项后得显示结果。
  mysql> status;
  --------------
  mysql  Ver 14.7 Distrib 4.1.9, for pc-linux-gnu (i686)
  Connection id:          62
  Current database:
  Current user:           root@localhost
  SSL:                    Not in use
  Current pager:          stdout
  Using outfile:          ''
  Using delimiter:        ;
  Server version:         5.1.11-beta-log
  Protocol version:       10
  Connection:             Localhost via UNIX socket
  Server characterset:    latin1
  Db     characterset:    utf8
  Client characterset:    utf8
  Conn.  characterset:    latin1
  UNIX socket:            /tmp/mysql.sock
  Uptime:                 1 hour 6 min 18 sec
  Threads: 2  Questions: 1071  Slow queries: 0  Opens: 0  Flush tables: 1  Open tables: 75  Queries per second avg: 0.269
  --------------
  mysql> SHOW VARIABLES LIKE 'character_set_%';
  +--------------------------+---------------------------------------------------------------------------+
  | Variable_name            | Value                                                                     |
  +--------------------------+---------------------------------------------------------------------------+
  | character_set_client     | latin1                                                                    |
  | character_set_connection | latin1                                                                    |
  | character_set_database   | utf8                &
nbsp;                                                     |
  | character_set_filesystem | binary                                                                    |
  | character_set_results    | latin1                                                                    |
  | character_set_server     | utf8                                                                      |
  | character_set_system     | utf8                                                                      |
  | character_sets_dir       | /usr/local/src/mysql-5.1.11-beta-linux-i686-glibc23/share/mysql/charsets/ |
  +--------------------------+---------------------------------------------------------------------------+
  8 rows in set (0.00 sec)
  mysql> SHOW VARIABLES LIKE 'collation_%';
  +----------------------+-------------------+
  | Variable_name        | Value             |
  +----------------------+-------------------+
  | collation_connection | latin1_swedish_ci |
  | collation_database   | utf8_general_ci   |
  | collation_server     | utf8_general_ci   |
  +----------------------+-------------------+
  3 rows in set (0.01 sec)
  从上面可以看出,使用了配置文件中修改默认字符集的方法,并没有把client、connection、
  results这三项改成utf8,而且在建数据库的时候我们可以通过这样的指令实现数据库的字符集设置:
  CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
  这样此数据库内的所有表和字段都将为utf8字符集编码,所以在配置文件中修改的方法也就失去了意义。
  b、我的解决办法。
  我们可以完全无视数据库默认的字符集是什么,我们关心的只有数据库在建立的时候是不是加入了字符集
  选择。
  (1)使用如下指令建立数据库:
  CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
  (2)客户端php程序使用如下方法设定连接所使用的字符集:
  PHP程序在查询数据库之前,执行mysql_query("set names utf8;");
  例子:
  1. <?php
  2. mysql_connect('localhost','user','password');
  3. mysql_select_db('my_db');
  4.
  5. //请注意,这步很关键,如果没有这步,所有的数据读写都会不正确的
  6. //它的作用是设置本次数据库联接过程中,数据传输的默认字符集
  7. mysql_query("set names utf8;");
  8.
  9. //必须将gb2312(本地编码)转换成utf-8,也可以使用iconv()函数
  10. mysql_query(mb_convet_encoding("insert into my_table values('测试');","utf-8","gb2312"));
  11. ?>
  (3)如果你想使用gb2312编码,那么建议你使用latin1作为数据表的默认字符集,这样就能直接用中
  文在命令行工具中插入数据,并且可以直接显示出来.而不要使用gb2312或者gbk等字符集,如果担心查询
  排序等问题,可以使用binary属性约束,例如:
  create table my_table ( name varchar(20) binary not null default '')type=myisam default charset latin1;
  自此,使用utf8字符集的完整的例子结束了。
  三、旧数据升级办法
  (1)导出数据库:
  mysqldump -uroot -p123456 --default-character-set=latin1 --set-charset=utf8 --opt olddatabase > newdatabase.sql
  (2)修改newdatabase.sql,在文件开头增加一条sql语句: “SET NAMES utf8;“,保存。
  (3)mysql -hlocalhost -uroot my_db <newdatabase.sql
  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 id is 1
  Server version: 5.1.22-rc-community-log MySQL Community Edition (GPL)
  Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
  5.查看字符集设置
  mysql> show variables like 'collation_%';
  +----------------------+-----------------+
  | Variable_name        | Value           |
  +----------------------+-----------------+
  | collation_connection | utf8_general_ci |
  | collation_database   | utf8_general_ci |
  | collation_server     | utf8_general_ci |
  +----------------------+-----------------+
  3 rows in set (0.02 sec)
  mysql> show variables like 'character_set_%';
  +--------------------------+----------------------------+
  | 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       | /usr/share/mysql/charsets/ |
  +--------------------------+----------------------------+
  8 rows in set (0.02 sec)
  mysql>
  其他的一些设置方法:
  修改数据库的字符集
  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)
  查看:
  mysql> show variables like 'character_set_%';
  +--------------------------+----------------------------+
  | 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       | /usr/share/mysql/charsets/ |
  +--------------------------+----------------------------+
  8 rows in set (0.03 sec)
  mysql> show variables like 'collation_%';
  +----------------------+-----------------+
  | Variable_name        | Value           |
  +----------------------+-----------------+
  | collation_connection | utf8_general_ci |
  | collation_database   | utf8_general_ci |
  | collation_server     | utf8_general_ci |
  +----------------------+-----------------+
  3 rows in set (0.04 sec)
  -------------------------------------------------------------------------
  【知识性文章转载】
  MYSQL 字符集问题
  MySQL的字符集支持(Character Set Support)有两个方面:
  字符集(Character set)和排序方式(Collation)。
  对于字符集的支持细化到四个层次:
  服务器(server),数据库(database),数据表(table)和连接(connection)。
  1.MySQL默认字符集
  MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,应该用什么字符集。
  但是,传统的程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?    (1)编译MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;
  (2)安装MySQL 时,可以在配置文件 (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 存储。
  2.查看默认字符集(默认情况下,mysql的字符集是latin1(ISO_8859_1)
  通常,查看系统的字符集和排序方式的设定可以通过下面的两条命令:
  mysql> SHOW VARIABLES LIKE 'character%';
  +--------------------------+---------------------------------+
  | 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       | D:"mysql-5.0.37"share"charsets" |
  +--------------------------+---------------------------------+
  mysql> SHOW VARIABLES LIKE 'collation_%';
  +----------------------+-----------------+
  | Variable_name        | Value           |
  +----------------------+-----------------+
  | collation_connection | utf8_general_ci |
  | collation_database   | utf8_general_ci |
  | collation_server     | utf8_general_ci |
  +----------------------+-----------------+
  3.修改默认字符集
  (1) 最简单的修改方法,就是修改mysql的my.ini文件中的字符集键值,
  如    default-character-set = utf8
  character_set_server = utf8
  修改完后,重启mysql的服务,service mysql restart
  使用 mysql> SHOW VARIABLES LIKE 'character%';查看,发现数据库编码均已改成utf8
  +--------------------------+---------------------------------+
  | 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               &nbsp;       |
  | character_sets_dir       | D:"mysql-5.0.37"share"charsets" |
  +--------------------------+---------------------------------+
  (2) 还有一种修改字符集的方法,就是使用mysql的命令
  mysql> SET character_set_client = utf8 ;
  mysql> SET character_set_connection = utf8 ;
  mysql> SET character_set_database = utf8 ;
  mysql> SET character_set_results = utf8 ;

本篇文章来源于 80后网络管理员 - 小胡 (http://www.life80.cn) 原文出处:http://www.life80.cn/HPFFiles/20110528/DA4426F1-3D52-4261-863D-DF60C4E2CD21-2011052810355.Html
分享到:
评论

相关推荐

    mysql乱码问题解决

    ### MySQL乱码问题解决方案 在处理数据库操作时,字符集编码问题经常会导致数据展示或存储过程中出现乱码现象。MySQL作为广泛使用的开源关系型数据库管理系统之一,在实际应用中也难免会遇到字符集不匹配导致的数据...

    彻底解决C# asp.net连接MySQL乱码问题

    ### 彻底解决C# ASP.NET 连接MySQL乱码问题 在开发过程中,尤其是在处理中文数据时,经常遇到的一个问题是数据库连接时出现乱码。本文将详细介绍如何彻底解决使用C# ASP.NET 应用程序连接 MySQL 数据库时出现的乱码...

    mysql中文乱码问题

    MySQL 中文乱码问题解决方法 MySQL 是一个功能强大且广泛应用的关系型数据库管理系统,但是,在使用 MySQL 时,用户经常会遇到中文乱码问题。今天,我们将讨论在 MySQL 中的中文乱码问题,并提供解决方法。 MySQL...

    hibernate+mysql乱码问题

    本文将深入探讨“hibernate+mysql乱码问题”的原因、解决方案以及如何预防这类问题。 首先,我们需要了解乱码问题的根源。在数据库层面,MySQL的编码格式对数据存储和检索至关重要。如果数据库、表或列的字符集不...

    MySQL乱码解决方案数据库乱码

    ### MySQL乱码问题详解与解决方案 #### 一、MySQL乱码背景及原因分析 在处理MySQL数据库时,遇到字符集编码不一致导致的数据乱码问题非常常见。这不仅会影响数据的正确显示,还可能导致数据丢失或损坏。根据提供的...

    mysql乱码解决问题

    ### MySQL乱码问题解决方案 #### 一、问题背景 在MySQL数据库操作过程中,经常会遇到中文乱码的问题。尤其是在处理简体中文数据时,如果数据库或连接客户端的字符集设置不当,很容易导致显示乱码或者存储错误的...

    MySql乱码问题解决方法

    本篇文章将深入探讨MySQL乱码问题的原因,并提供一系列详细的解决方法。 1. **问题原因** - **编码不匹配**:数据库、表、字段的字符集设置与输入数据的编码不一致。 - **传输过程中的编码转换**:数据在传输过程...

    解决mysql乱码问题全解决

    ### 解决MySQL乱码问题全解析 #### 一、引言 在数据库操作过程中,遇到乱码问题是较为常见的现象之一,尤其是对于频繁更换虚拟主机环境的用户来说,由于不同的服务提供商可能采用不同的MySQL版本,这很容易导致数据...

    windows访问远程linux下mysql乱码问题

    Windows 访问远程 Linux 下 MySQL 乱码问题解决方案 在实践中,我们经常遇到 Windows 访问远程 Linux 下 MySQL 数据库时出现乱码问题。这种问题的主要原因是 Windows 和 Linux 的字符编码方式不同。Windows 使用的...

    mysql乱码问题解决办法

    ### MySQL乱码问题解决办法 在使用MySQL的过程中,经常会出现字符显示乱码的问题,尤其是在处理中文数据时更为常见。本文将详细介绍如何通过多种途径解决MySQL中的乱码问题,包括更改MySQL服务器的字符集设置、调整...

    c#解决mysql乱码问题的解决及mysql数据库操作的封装

    首先,MySQL乱码问题的根源通常在于字符集设置。MySQL数据库、数据库表以及字段都有各自的字符集设定,这些设定需要保持一致。例如,如果你的数据库服务器使用的是UTF-8编码,那么在创建表或者插入数据时,也需要...

    mysql汉字乱码问题

    MySQL中的汉字乱码问题是一个常见的困扰许多开发人员和数据库管理员的问题。这主要涉及到字符编码设置不正确,导致在存储或显示汉字时出现乱码。在MySQL中,字符集是用来定义如何存储和处理字符的规则,它包括服务器...

    mysql乱码解决方法

    当从MySQL 4.1以下版本升级到4.1及以上版本时,可能会出现字符集兼容性问题,导致乱码。解决方法包括: - 确保所有数据库、表、字段的字符集设置为UTF-8。 - 如果是从非UTF-8编码的数据导入,需要先将数据文件...

    解决mysql乱码问题

    可以完美的帮你解决windows下mysql的乱码问题,保证数据库数据不被乱码侵蚀

    Linux下MySQL解决乱码问题

    ### Linux下MySQL解决乱码问题 #### 背景与问题描述 在使用Linux系统时,部分用户可能会遇到MySQL数据库无法正确显示或录入中文字符的问题,即所谓的“乱码”现象。这种问题不仅影响数据的准确性和完整性,还可能...

    解决 docker mysql 中文乱码问题

    使用 docker 启动 mysql 容器可能会出现中文乱码的情况,这里记录如何制作支持中文的 mysql 镜像 docker版本:18.06 mysql 版本:5.7 1. 创建 my.cnf 文件 [client] default-character-set=utf8 [mysql] default-...

    mac MySQL中文乱码解决办法

    在macOS系统中,使用MySQL数据库时,可能会遇到中文乱码的问题,这通常是由于字符集设置不正确导致的。本文将详细介绍如何解决macOS系统下MySQL中文乱码的问题,通过修改配置文件my.cnf来调整MySQL的字符集,确保...

Global site tag (gtag.js) - Google Analytics