MySql 乱码解决方案

BZ  在使用mysql5.5 的时候   存进去汉字 出来字符串乱码,于是去网上搜了一下解决方案。


现总结如下,


  网上比较推荐的方式:N0.1  设置数据库默认的编码模式 


MySQL会出现中文乱码的原因不外乎下列几点:
1.server本身设定问题,例如还停留在latin1
2.table的语系设定问题(包含character与collation)
3.客户端程式(例如php)的连线语系设定问题
强烈建议使用utf8!!!!
utf8可以兼容世界上所有字符!!!!
一、避免创建数据库及表出现中文乱码和查看编码方法
1、创建数据库的时候:CREATE DATABASE `test`
CHARACTER SET 'utf8'
COLLATE 'utf8_general_ci';
2、建表的时候 CREATE TABLE `database_user` (
`ID` varchar(40) NOT NULL default '',
`UserID` varchar(40) NOT NULL default '',
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这3个设置好了,基本就不会出问题了,即建库和建表时都使用相同的编码格式。
但是如果你已经建了库和表可以通过以下方式进行查询。
1.查看默认的编码格式:
mysql> show variables like "%char%";
+--------------------------+---------------+
| Variable_name | Value |
+--------------------------+---------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | utf8 |
| character_set_system | utf8 |
+--------------------------+-------------+
注:以前2个来确定,可以使用set names utf8,set names gbk设置默认的编码格式;

执行SET NAMES utf8的效果等同于同时设定如下:
SET character_set_client='utf8';
SET character_set_connection='utf8';
SET character_set_results='utf8';

2.查看test数据库的编码格式:
mysql> show create database test;
+------------+------------------------------------------------------------------------------------------------+
| Database | Create Database |
+------------+------------------------------------------------------------------------------------------------+
| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET gbk */ |
+------------+------------------------------------------------------------------------------------------------+

3.查看yjdb数据库的编码格式:
mysql> show create table yjdb;
| yjdb | CREATE TABLE `yjdb` (
`sn` int(5) NOT NULL AUTO_INCREMENT,
`type` varchar(10) NOT NULL,
`brc` varchar(6) NOT NULL,
`teller` int(6) NOT NULL,
`telname` varchar(10) NOT NULL,
`date` int(10) NOT NULL,
`count` int(6) NOT NULL,
`back` int(10) NOT NULL,
PRIMARY KEY (`sn`),
UNIQUE KEY `sn` (`sn`),
UNIQUE KEY `sn_2` (`sn`)
) ENGINE=MyISAM AUTO_INCREMENT=1826 DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC |

二、避免导入数据有中文乱码的问题
1:将数据编码格式保存为utf-8
设置默认编码为utf8:
set names utf8;
设置数据库db_name默认为utf8:
ALTER DATABASE `db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
设置表tb_name默认编码为utf8:
ALTER TABLE `tb_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
导入:
LOAD DATA LOCAL INFILE 'C:\\utf8.txt' INTO TABLE yjdb;
2:将数据编码格式保存为ansi(即GBK或GB2312)
设置默认编码为gbk:
set names gbk;
设置数据库db_name默认编码为gbk:
ALTER DATABASE `db_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
设置表tb_name默认编码为gbk:
ALTER TABLE `tb_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
导入:
LOAD DATA LOCAL INFILE 'C:\\gbk.txt' INTO TABLE yjdb;

注:1.UTF8不要导入gbk,gbk不要导入UTF8;
2.dos下不支持UTF8的显示;
三、解决网页中乱码的问题
 
将网站编码设为 utf-8,这样可以兼容世界上所有字符。
  如果网站已经运作了好久,已有很多旧数据,不能再更改简体中文的设定,那么建议将页面的编码设为 GBK, GBK与GB2312的区别就在于:GBK能比GB2312显示更多的字符,要显示简体码的繁体字,就只能用GBK。
1.编辑/etc/my.cnf ,在[mysql]段加入default_character_set=utf8;
2.在编写Connection URL时,加上?useUnicode=true&characterEncoding=utf-8参;
3.在网页代码中加上一个"set names utf8"或者"set names gbk"的指令,告诉MySQL连线内容都要使用
utf8或者gbk;

一个很D的人写的   来自:http://www.2cto.com/database/201108/101151.html


第二种的方法-- 貌似看起来 不如第一种D


ysql移植含有中文的数据时,很容易出现乱码问题。很多是在从mysql4.x向mysql5.x移植的时候出现。mysql的缺省字符集是 latin1,在使用mysql4.x的时候,很多人都是用的latin1字符集。而当使用mysql5时往往愿意使用utf8。那么我们的任务是不是要 把数据中的字符从latin1转为utf8呢?

不是的。

用一句不大准确,但又比较形象的说法是,在之前的系 统中,我们是用latin1保存了使用gb系列字符集(gbk、gb2312等)的汉字。怎么这样说呢?

mysql> show create table test\G

*************************** 1. row ***************************

Table: test

Create Table: CREATE TABLE `test`

`a` varchar(100) default NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

mysql> show create table testlatin1\G

*************************** 1. row ***************************

Table: testlatin1

Create Table: CREATE TABLE `testlatin1`

`a` varchar(100) default NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1

1 row in set (0.01 sec)

我们看到这两个表有不同的缺 省字符集。此字符集是告诉我们,如果没有特别指定列的字符集,那么字符类型列的字符集与表的缺省字符集一样。

列的字符集是要告诉 mysql,这里面保存的字符所使用的字符集是什么。但到底保存的是什么字符集的字符,不由mysql决定,mysql也不进行检查。

在utf8广泛使用之前,我们使用的汉字都是GB系列的字符集,比如GB2312、GBK、GB18030等等。

在缺省字符集为 latin1的mysql中,我们通常就把GB字符集的汉字保存到数据库中,但是却告诉mysql那是latin1字符集。而GB字符集是一个汉字占两个 字节,latin1是一个字符占一个字节。也就是说一个GB汉字被当成两个latin1字符来保存了。这让我想起了当初的iso8859_1,也是类似的 情况。只要我们保存和读取时都当作latin1,不进行转换,然后在显示时当作gb字符集,就能够正确使用。

那么怎么把 latin1保存的汉字正确地导到utf8字符集的数据库中呢?

首先,新的数据库中的列,要使用utf8字符集。一种办法是创建 database时指定缺省字符集,这样在建表时如果不指定字符集则使用database的缺省字符集。

导出的数据要以 latin1字符集导出,实际上就是告诉mysql导出时不做转换(因为原有的表都是latin1字符集的)。

mysqldump 出来以后,再用mysql进行导入时,还要告诉mysql,当前的数据是gb系列的字符集,比如gbk。这样,mysql负责把数据由gbk转换为 utf8,保存到数据库中。

如何告诉mysql导入的SQL是什么字符集呢,一种方法是用--default- character-set,但有时会起不到实际作用。这是因为mysqldump出来的文件里有set names语句。比如:

head EA192.060913.sql

-- MySQL dump 10.10

--

-- Host: localhost Database: EA192

-- ------------------------------------------------------

-- Server version 5.0.16-standard-log

;

;

;

;

是mysql特有有句法,在其他数据库会被当成注释忽略掉。/*!后面的 40101是表示版本,在4.1.1及以上版才执行该条语句。

这里看到有一条SET NAMES latin1。它的一个作用是告诉mysql,客户端传过去的数据是latin1字符集。因为有这样一条SET NAMES,--default-character-set也就起不到作用了。如果不幸有这样一条SQL,那么需要把它去掉或者改成SET NAMES gbk。修改或者删除的办法,当数据量比较大的时候,可以用head和tail来配合。比如还是上面的那个文件:

先用head看 一下SET NAMES在第几行(数一下),上面看到是第10行。

wc -l EA192.060913.sql

1987 EA192.060913.sql

得到总行数是1987

head -9 EA192.060913.sql > final.sql

brum@brum-laptop:~$ tail -1977 EA192.060913.sql >> final.sql

brum@brum-laptop:~$

head -9是取前9行,tail -1977是取后1977行,这样就把第10行隔过去了。

得到final.sql再用 mysql运行时,就可以使用--default-character-set=gbk了。

还有一种办法是mysqldump时使 用--set-charset=false,这样就不会出现SET NAMES了。

目前为止,还可能有问题,出在create table的SQL中,比如:

DROP TABLE IF EXISTS `test`;

CREATE TABLE `test`

`a` varchar(100) default NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

这里仍然有个CHARSET=latin1,它将导 致新创建的表的缺省字符集是latin1,而不是我们想要的。怎么办呢,如果数据量不大的话,可以考虑用编辑器把它去掉或者改成utf8,如果数据量大的 话可以考虑用sed,但可能仍然时间比较长。

还有一种办法就是mysqldump,使用--create- options=false,不导出表的创建属性。但如果导出的表的存储引擎不同的话就有问题了,因为引擎类型(innodb、myisam等)都被忽略 了。

此外,mysqldump导出时,不要使用-B,而是直接指定一个database名字,目的是不出现CREATE DATABASE语句,因为其中也可能会有缺省字符集的子句,会影响那些未在CREATE TABLE中指定字符集的表。如果你导出的SQL中有CREATE DATABASE,那么需要注意一下有没有字符集的子句,如果有的话,也需要修改。

好了,通过上述方法导出或者处理过的导出文件可以使用mysql --default-character-set=gbk来导入了。

总结,基本上执行的命令如下:

1、备份数据库

mysqldump --default-character-set=latin1 --create-options=false --set-charset=false -u root -p 数据库名称

>E:\back.sql

2、创建新数据库

CREATE DATABASE 数据库名称 CHARACTER SET utf8 COLLATE utf8_general_ci;

3、导入数据

mysql -u root -p --default-character-set=gbk 数据库名称<E:\back.sql

来自:http://blog.knowsky.com/186977.htm

===========================发现上面俩种全是在胡诌,半天我的额问题还是没有得到有效的解决========于是我又找来一个。。

这个应该就可以了

转自http://www.cnblogs.com/pricks

"

MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。下面将分两部分,分别设置服务器编码和数据库、数据表与连接部分的编码,从而杜绝中文乱码的出现。

  一 服务器编码设置

  服务器编码设置方法有二:

  一是安装mysql时,其中会有一个步骤选择编码方式,此时选择gbk即可。如果不选择,默认的编码是latin1;

  二是在安装玩mysql之后,手动修改其配置文件,如下:

  (1)修改 MySql安装目录下面的my.ini(MySQL Server Instance Configuration 文件)。 设置

        default-character-set=gbk(注意,有2处) 
  (2)修改data目录中相应数据库目录下的db.opt配置文件
        default-character-set=gbk
        default-collation=gbk_chinese_ci
 
  重启数据库,关闭控制台窗口重新登录数据库即可。
 
  二 数据库、数据表和连接部分的编码设置
  2.1 设置数据库和数据表编码
  要解决乱码问题,首先必须弄清楚数据库和数据表用什么编码。如果没有指明,将是默认的latin1。
用得最多的应该是这3种字符集 gb2312,gbk,utf8。
  如何去指定数据库和数据表的字符集呢?下面也gbk为例:
  【在MySQL Command Line Client创建数据库 】
  mysql> CREATE TABLE `mysqlcode` (
  -> `id` TINYINT( 255 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  -> `content` VARCHAR( 255 ) NOT NULL
  -> ) TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
  Query OK, 0 rows affected, 1 warning (0.03 sec)
  其中后面的TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
就是指定数据库的字符集,COLLATE (校勘),让mysql同时支持多种编码的数据库。
  当然也可以通过如下指令修改数据库数据表的字符集:
    alter database mysqlcode default character set 'gbk'.
  前面已经设置了服务器、数据库和数据表的编码,那么数据库中的编码便都是
gbk,中文可以存储进去。
但是如果你要通过执行insert或select等操作时,仍然 会出现中文乱码问题,这是因为还没设置
“连接(connection)”部分的编码,而 insert、select等数据库操作都包含与数据库的连接动作。如果不信
,你现在可以 执行下面的sql文试一试:
  mysql> insert into mysqlcode values(null,'java爱好者');
  按回车,结果如下:
  ERROR 1406 (22001): Data too long for column 'content' at row 1
  
  2.2 设置连接编码
  设置了服务器、数据库和数据表部分的编码,必须设置连接编码。连接编码设置如下:
  mysql> SET character_set_client='gbk';
  mysql> SET character_set_connection='gbk'
  mysql> SET character_set_results='gbk'

  设置好连接编码,下面便可以成功插入中文了:
  mysql> insert into mysqlcode values(null,'java爱好者');
  Query OK, 0 rows affected (0.02 sec)
  
  其实,上面设置连接编码的三条命令可以简化为一条:
  mysql> set names 'gbk';
  
  设置好了连接编码后,在select查询时,也能正确显示中文:
  mysql> select * from mysqlcode;
  +----+-----------+
  | id | content |
  +----+-----------+
  | 1   | java爱好着 |
  +----+-----------+
  1 row in set (0.00 sec)
 
 
   三 完整示例
  下面将用一个例子完整地将上面的理论演示一遍,最后达到能向mysql中插入中文的目的:
   3.1 设置mysql服务器编码
  这一步请参见上文第一节,主要就是在安装mysql之后,修改my.ini和dataTable.db中的编码为gbk
 
   3.2 创建一个数据库
  先连接到本地数据库:mysql -h localhost -u root -proot,接着创建一个数据库:
  mysql> create database test;
 
   3.3 创建数据表并设置其编码
  -- 中文编码测试数据表
  use test
  DROP TABLE IF EXISTS `test`.`test_nml`;
  SET @saved_cs_client = @@character_set_client;
  SET character_set_client = gbk;
  CREATE TABLE  `test`.`test_nml` (
    `id` TINYINT( 255 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `content` VARCHAR( 255 ) NOT NULL
  )  ENGINE=InnoDB DEFAULT CHARSET=gbk COMMENT='用户基本信息';
  SET character_set_client = @saved_cs_client;
  这里的红色部分等价于上文中的 TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
   3.4 插入中文数据
  --插入数据
  SET @saved_cs_client = @@character_set_client;
  set names gbk;
  insert into test_nml values(null,'我是中文');
  
  注意:每次执行insert或update或select连接操作时,都必须设置编码,即在前面加上:set names 'gbk';



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值