mysql中文乱码解决方法汇总

发布时间:2020-05-07编辑:脚本学堂
出现mysql中文乱码问题,大多是因为在不同的平台下,编码不一致所引起的,本文就这一问题作详细的探讨,并给出相应的解决方法。有需要的朋友,参考下吧。

有人要问,为什么都要改成utf8呢?改成GB2312不行吗?

解释如下:
我也不想改成utf8,只是phpmyadmin2.6在mysql4.1的时候只会用utf8,连其他页面的charset也都是utf8,改成gb2312一定会乱码,只能凑phpmyadmin了。
只有在mysql3.23的时候,phpmyadmin才会多一个gb2312的页面charset,这时候是正常的。

3.将以前的mysql3的库文件导入mysql4.1的库
有两种情况:
一是从phpmyadmin上导入,这时候你要注意的是在选择库文件的页面左下脚有个“文件的字符集:”,默认是utf8,要改成gb2312,否则导进去乱码;
二是在linux下导入,这时候你需要先在库文件的头部加一行:
SET NAMES 'gb2312'; 注意最后也是;号,别漏了。
然后执行mysql -u用户名 -p密码 xxx.sql > 库名
导入完成以后再用phpmyadmin打开看,里面的中文字就是正确的。

4.从mysql4.1里导出库文件
一.用phpmyadmin导出
导出倒是问题不大,如果phpmyadmin的浏览页面里显示的中文是正常的,那么导出肯定也是正常的
二.在linux上导出
如果用mysqldump导出出现了乱码也没有关系,可以运行iconv来转换一下
 

复制代码 代码示例:
iconv -c -f UTF-8 -t GB2312 库文件名 > 新的gb2312的库文件名
 

综上所述,你要注意:
1。尽量在需要导入的库文件的开头加入SET NAMES 'gb2312';告诉mysql你要导入的是一个gb2312的文件;
2。可能你需要这个:
 

复制代码 代码示例:
SET NAMES 'utf8';
 

在登陆到mysql后用,把character的一些默认参数改到utf8上,有时可以减少一些困扰,不过也不是必须的。
在mysql上使用:
 

复制代码 代码示例:
SHOW VARIABLES LIKE 'character_set_%';
 

用来查看当前的状态。
3.如果出现乱码也不要怕,一是你要注意留存原有的备份,二是用iconv来进行转化。
在正常使用之前注意做导入导出的测试,确保万无一失。

我升级了MYSQL到4.1.2,phpmyadmin用的是2.6.2。数据表里面有中文的字段中文都变成了乱码,导出数据也是乱码。我用以前的2.5.7没有问题,想问一下,应该在phpmyadmin的那个文件里改哪个设置一下才能显示出来的是正常的中文字?
和字符相关的变量中这几个和sql很有关系:
 

复制代码 代码示例:
character_set_client
character_set_connection
character_set_results
 

此外就是数据库中对相应字段设置的charact set,如果没有对字段设置,缺省是table的charact set,table也没有指定则缺省使用database的。
上面3个变量的作用是这样的,client表示客户端发送过来的字符集,results表示发送到客户端的字符集(这两个分开是因为发送过来和发送过去的不一定是同一个客户端),connection则在客户端和数据库起一个连接作用。

具体是这样:比如我在mysql命令行设置client为gbk,connection为utf8,results为gbk,数据库为big5,
当我发送一个insert语句的时候,这个语句作为gbk代码,先转为utf8代码(connection),再转为big5(database)插入数据库。
而运行一个select语句的时候,从数据库得到的结果则相反的过程,由big5转为utf8,再转为gbk,你得到gbk的结果。
因此最主要的是让client和results和你使用的客户端一致。比如你的网页是utf8编码,你就要设置这两个为utf8。
而在mysql命令行的时候,我用的是2000,需要设置为gbk
而用的set names XXX,实际上就是同时设置这3个变量为XXX。
在这样的情况下,可以把一个数据库中的不同表或不同字段设为不同的字符集,只要上面3个设置正确,就可以在数据库中同时使用不同的字符集。
注意要保证你的数据库中的字符已经使用了正确的字符集,比如如果一开始你设置错误,插入数据后,本身数据的编码就是不正确的,然后即使设置改回来,也不可能得到正确的显示了。
还有一个是编码互相之间的兼容性,如果一个字符在gbk中有,在utf8中没有,那么在gbk-》utf8-》gbk的过程中,它就变成了“?”

具体解决的办法。
首先要指定你的升级后的database及table及field的character set,一般来说用gb2312或者utf8的,如果不同时使用多种编码,只要指定database就可以,可以在建库的sql语句加上相应的 character set,在phpMyAdmin里也可以修改。

然后是导入旧数据。首先要确定自己的数据文件的编码。如果用phpMyAdmin导入,在界面上有文件编码的选项,一定要和数据文件的编码一致。
如果从mysql的命令行导入,就要自己设置上面说到的3个变量,set names xxx。
使用其它的客户端程序一样要注意。

这样就可以让旧数据转入新数据库后的编码才是正确的,如果这一步错了,后面不可能得到正确的显示。
然后是自己的程序,在连接后就可以执行一次set names xxx,根据你的网页编码而定。
这样基本就可以保证编码正确了。
你很有可能是导入的数据编码已经不对了。

MYSQL数据库默认语言为瑞典语, 现有一GB2312字符的数据库.
结构OK. 为什么内容是乱码? 不重装数据库有办法解决码?
从MySQL 4.1开始引入的多语言支持确实很棒,而且一些特性已经超过了其他的数据库系统。不过我在测试过程中发现使用适用于MySQL 4.1之前的PHP语句操作MySQL数据库会造成乱码,即使是设置过了表字符集也是如此。我读了一下新的MySQL在线手册中第十章 "Character Set Support"后终于找到了解决方法并测试通过。
MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。
查看系统的字符集和排序方式的设定可以通过下面的两条命令:
 

复制代码 代码示例:
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

上面列出的值就是系统的默认值。(很奇怪系统怎么默认是latin1的瑞典语排序方式)...
当按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:
 

复制代码 代码示例:
SET NAMES 'utf8';
 

它相当于下面的三句指令:
 

复制代码 代码示例:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
 

再试试看,正常了吧?
具体讲
在你的查询前加一行:
 

复制代码 代码示例:
mysql_query("SET NAMES 'gb2312';",$this->con);
 

真应该把手册仔细看一遍.
和字符相关的变量中这几个和sql很有关系:
 

复制代码 代码示例:
character_set_client
character_set_connection
character_set_results
 

此外就是数据库中对相应字段设置的charact set,如果没有对字段设置,缺省是table的charact set,table也没有指定则缺省使用database的。
上面3个变量的作用是这样的,client表示客户端发送过来的字符集,results表示发送到客户端的字符集(这两个分开是因为发送过来和发送过去的不一定是同一个客户端),connection则在客户端和数据库起一个连接作用。

具体是这样:比如在mysql命令行设置client为gbk,connection为utf8,results为gbk,数据库为big5,
当发送一个insert语句的时候,这个语句作为gbk代码,先转为utf8代码(connection),再转为big5(database)插入数据库。
而运行一个select语句的时候,从数据库得到的结果则相反的过程,由big5转为utf8,再转为gbk,你得到gbk的结果。
因此最主要的是让client和results和你使用的客户端一致。比如你的网页是utf8编码,你就要设置这两个为utf8。

而在mysql命令行的时候,我用的是2000,需要设置为gbk
而用的set names XXX,实际上就是同时设置这3个变量为XXX。
在这样的情况下,可以把一个数据库中的不同表或不同字段设为不同的字符集,只要上面3个设置正确,就可以在数据库中同时使用不同的字符集。
注意要保证你的数据库中的字符已经使用了正确的字符集,比如如果一开始你设置错误,插入数据后,本身数据的编码就是不正确的,然后即使设置改回来,也不可能得到正确的显示了。
还有一个是编码互相之间的兼容性,如果一个字符在gbk中有,在utf8中没有,那么在gbk-》utf8-》gbk的过程中,它就变成了“?”
再说一下具体解决的办法。

首先要指定你的升级后的database及table及field的character set,一般来说用gb2312或者utf8的,如果不同时使用多种编码,只要指定database就可以,可以在建库的sql语句加上相应的 character set,在phpMyAdmin里也可以修改。

然后是导入旧数据。首先要确定自己的数据文件的编码。如果用phpMyAdmin导入,在界面上有文件编码的选项,一定要和数据文件的编码一致。
如果从mysql的命令行导入,就要自己设置上面说到的3个变量,set names xxx。
使用其它的客户端程序一样要注意。

这样就可以让旧数据转入新数据库后的编码才是正确的,如果这一步错了,后面不可能得到正确的显示。
然后是自己的程序,在连接后就可以执行一次set names xxx,根据你的网页编码而定。

mysql 导入乱码问题- -
mysql从4.1使用mysqldump导出数据并在4.0导入的时候会出现sql语句错误,并且所有数据变成乱码。使用下面的参数就可以解决
 

复制代码 代码示例:
mysqldump -uxunai -p --compatible=mysql40 --default-character-set=latin1 xunai>xunai.sql
mysql -uroot -p fmx < fmx3.sql -f --default-character-set=latin1

您可能感兴趣的文章:
windows下Mysql中文乱码的解决方法
mysql中文乱码解决方法汇总
mysql导入导出数据时中文乱码的解决办法
mysql还原时乱码的解决方法
mysql导入数据后出现乱码的解决办法
mysql备份还原后中文乱码的解决办法