关于MySQL乱码问题总结

前段时间在跨版本迁移MySQL数据的时候总是越到乱码问题,现总结一下。

思想:数据乱码其实就是数据在写入时和读出时使用了不同的字符编码规则,解决乱码也就是统一字符编码规则,也叫统一字符集。比如数据库表使用ascii编码存储数据,而在插入或读取数据时使用gb2312一定会出乱码。

在MySQL中字符集是多层继承的,MySQL默认字符集——>数据库字符集——>表字符集。在创建数据中若未指定数据库字符集,则新建的库继承MySQL默认字符集,同样,若新建表未指定字符集则继承所属的数据库字符集。在新搭建一台MySQL服务时一定要提前设定好默认字集,MySQL默认为latin1,为了兼容多国语言推荐使用utf8。

MySQL默认字符集指定方法:

修改my.cnf配置文件:

[mysqld]

default-character-set=utf8         #适用于5.1及以前版本

character-set-server=utf8#适用于5.5版本

检查当前字符集设置:

SHOW VARIABLES LIKE ‘character%‘;        #执行此命令可查询当前环境中关于字符集的设置,如下:

character_set_client: 客户端。由配置文件中的default-character-set指定,若不指定则会读取当前shell终端的字符集,并保持与之保持一直。

character_set_connection:当前连接。当客户端和服务器字符集不同时以此连接为准。由配置文件中的default-character-set指定,若不指定则会读取当前shell终端的字符集,并保持与之保持一直。

character_set_database: 数据库字符集。由配置文件指定或建库建表时指定。由服务器端参数character_set_server指定

character_set_filesystem: 字符集文件系统

character_set_results: 返回结果。由配置文件中的default-character-set指定,若不指定则会读取当前shell终端的字符集,并保持与之保持一直。

character_set_server: 服务器字符集,配置文件指定或建库建表指定。由服务器端参数character_set_server指定

默认情况下character_set_client、character_set_connection和character_set_results与系统的字符集一致(/etc/sysconfig/i18n)。

查询数据时乱码:

1、在查询数据时乱码时首先要先查询出当前数据库乃至表的当前字符编码,命令如下:

SHOW CREATE DATABASE DatabaseName;        #查询数据库编码规则

SHOW CREATE TABLE DatabaseName.TableName;    #查询表的编码规则

2、根据库或表的编码所用字符集修改SELECT查询时反馈数据的编码字符集:

SET NAMES CharacterSet;    #设定NAMES值,此命令会同时修改character_set_client、character_set_connection和character_set_results。此设置临时生效。

或修改my.cnf配置文件:

[client]

default-character-set=CharacterSet        #配置文件中修改永久生效

插入数据后乱码:

在拷入数据时同查询时一样,首先要保证写入数据时的编码同表的编码规则一致。可通过修改NAMES实现。或使用脚本导入时指定编码,以gb2312为例:

SET NAMES gb2312;     或:

mysql --default-character-set=gb2312 DatabaseName < DatabaseName.sql

迁移数据:

若要从一个MySQL服务器中将数据迁移至另一台MySQL服务器,可通过mysqldump导出数据,将数据拷贝至新服务器后再导入。

1、在导出数据前一定要查看预导出数据库表的编码规则:

SHOW CREATE TABLE DatabaseName.TableName;

2、依据该规则指定字符集导出:

mysqldump -hHostIP -uUsername -p --default-character-set=CharacterSet DatabaseName > DatabaseName.sql

3、数据拷贝至新服务器后,在导入时指定新数据库表的字符集:

mysql --default-character-set=NewCharacterSet DatabaseName < DatabaseName.sql

注意:

1)在新MySQL服务器中导入数据前要注意检查DatabaseName.sql脚本文件中指定的存储引擎和字符集是否与新服务器一致,若不一致可使用sed命令修改;

2)mysqldump导出的脚本文件中没有新建数据库,需要提前手工创建数据库,并在导入时指定该数据库;

时间: 2024-08-10 12:43:42

关于MySQL乱码问题总结的相关文章

hibernate 连接 mysql 乱码的情况

在本地开发环境中,一切正常,部署到服务器后(windows 2003 + tomcat)含有中文的查询和表单提交都有乱码,从以下几个方面检查并解决了问题: 1.将所有jsp.js.css文件默认编码改为了utf-8,未解决问题. 2.struts2的配置文件中加入了节点:<constant name="struts.i18n.encoding" value="UTF-8" />  ,未解决问题. 3.web.xml中做如下确认和修改,未解决问题. <

10分钟学会理解和解决MySQL乱码问题

本文将详细介绍MySQL乱码的成因和具体的解决方案 MySQL出现乱码的原因 要了解为什么会出现乱码,我们就先要理解:从客户端发起请求,到MySQL存储数据,再到下次从表取回客户端的过程中,哪些环节会有编码/解码的行为.为了更好的解释这个过程,博主制作了两张流程图,分别对应存入和取出两个阶段. 存入MySQL经历的编码转换过程 上图中有3次编码/解码的过程(红色箭头).三个红色箭头分别对应:客户端编码,MySQL Server解码,Client编码向表编码的转换.其中Terminal可以是一个B

mysql 乱码解决方案

如何解决MYSQL数据中文乱码问题? 第一种方法,总结: 经常更换虚拟主机,而各个服务商的MYSQL版本不同,当导入数据后,总会出现乱码等无法正常显示的问题,查了好多资料,总结出自己的一点技巧: WINDOWS 下导入应该这样使用MYSQL的命令在DOS命令下进入mysql的bin目录下,输入mysql -uroot -p密码 数据库名称<要恢复的数据库, 例如我们要把D盘的一个名称为test.sql的数据库恢复到本地的test2这个数据库,那么就这样: mysql -uroot -p密码 te

ubuntu安装mysql乱码解决

ubuntu安装mysql乱码解决 1.问题描述: 插入汉字: 乱码显示: 2.解决方法: 执行下面命令: 添加如下粉色区域内容: 即:character-set-server= utf8 保存退出. 重启mysql: 3.验证乱码是否解决: 重新建一个数据库: 进入数据库: 创建表: 插入包含汉字数据: 查询表内容: 汉字正常显示: 更改后,汉字正常显示.

理解和解决MySQL乱码问题

MySQL出现乱码的原因 要了解为什么会出现乱码,我们就先要理解:从客户端发起请求,到MySQL存储数据,再到下次从表取回客户端的过程中,哪些环节会有编码/解码的行为.为了更好的解释这个过程,博主制作了两张流程图,分别对应存入和取出两个阶段. 存入MySQL经历的编码转换过程 上图中有3次编码/解码的过程(红色箭头).三个红色箭头分别对应:客户端编码,MySQL Server解码,Client编码向表编码的转换.其中Terminal可以是一个Bash,一个web页面又或者是一个APP.本文中我们

sql点滴40—mysql乱码问题总结

原文:sql点滴40-mysql乱码问题总结 本文将为大家讲解如何处理Java连接过程中的MySQL中文乱码问题.一般MySQL中文乱码问题都是与字符集有关,这里作者的经历也大致差不多. MySQL默认编码是latin1 1. mysql> show variables like 'character%'; 2. +--------------------------+--------------------------+ 3. | Variable_name | Value | 4. +---

MySQL乱码收集_持续更新

1.在mysql中执行下句成功,可添加中文的. insert into book(bookName,author,publish) values('好','hao','hao'); 但是在jsp中执行这个insert 语句就会出现乱码. 解决方案:在url后面加上?useUnicode=true&characterEncoding=utf-8 2.导入txt文件中的sql语句,乱码. 先是执行show variables like '%char%'; +---------------------

理解和解决 MySQL 乱码问题(转载)

理解和解决 MySQL 乱码问题(转载) 转载自:http://linux.cn/article-5028-1.html MySQL出现乱码的原因 要了解为什么会出现乱码,我们就先要理解:从客户端发起请求,到MySQL存储数据,再到下次从表取回客户端的过程中,哪些环节会有编码/解码的行为.为了更好的解释这个过程,博主制作了两张流程图,分别对应存入和取出两个阶段. 存入MySQL经历的编码转换过程 上图中有3次编码/解码的过程(红色箭头).三个红色箭头分别对应:客户端编码,MySQL Server

MySQL乱码解决办法

MySQL支持几十种编码方式,并且默认的编码为:latinl,如果MySQL出现了乱码情况,不要慌乱,一下为你介绍两种解决编码方式: 在控制台输入命令,注意MySQL中的UTF-8写成utf8,例如我现在有一个数据库名称为:lcychina,设置如下: mysql> alter database lcychina character set utf8;Query OK, 1 row affected mysql> 查看当前数据库编码方式命令为: mysql> show variables

命令行中mysql乱码问题

1.现象 在命令行中,执行sql语句如果包含中问题,提示“ Data too long for column '列名' at row 1” 或者在命令行中查询出的结果中,中文乱码 2.分析 a.查看命令行的默认编码方式:右击命令行标题栏--属性--当前代码页 b.查看mysql中客户端与结果集的编码方式 show variables like 'character%';,可以看到,客户端与结果集的编码方式都是utf8 问题找到了,命令行与mysql的编码方式不一样导致的乱码: 3.解决方法 先停