`
ssxxjjii
  • 浏览: 957131 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

正确设定MySQL中的字符集,解决终端乱码问题

阅读更多
正确设定MySQL中的字符集,解决终端乱码问题

我们经常在telnet终端操作MySQL数据库时会遇到中文乱码问题,这主要是因为字符集设定错误造成的。这里面涉及到好几个地方的字符集设置,如果我们搞清楚它后面的原理,就可以很容易解决这些乱码问题。

在MySQL的客户端上执行一次查询的过程一般是,在客户端的提示符后面输入一条SQL语句,回车,然后终端显示出查询的结果。这个过程中,只有终端和三个MySQL的系统变量指定了正确的字符集,才能保证我们将一个正确的SQL语句送到服务器,然后服务器返回正确的结果,并且在终端正确显示。

三个MySQL的系统变量是:

1. character_set_client,终端字符集,告诉Server客户端提交的SQL语句的编码格式

2. character_set_connection,连接字符集,是服务器翻译SQL语句时用到的编码格式

3. character_set_results,返回的结果集的字符集,是服务器返回结果集之前把结果集转换成的编码格式

在MySQL终端通过执行命令 show variables like ‘char%’ 可以查看这几个变量的值。这三个变量通常都设定为同一种字符集,用命令set names [charset name]就可以修改这三个变量的值。一般来说,只要你设定了能够表示你的数据的字符集,你查询的结果都可以在终端正确显示。比如你在数据库中存入了中文数据,不管存入时使用的什么字符集,你在终端即可以用set names命令设置为utf8,也可以设置为gbk编码,只要你的终端显示的字符集和你的设定一致就可以正确处理中文。

举个例子,使用的表t1是utf8编码,表中的字段c1继承了这个编码,表创建如下

mysql> create table t1 ( c1 text not null ) character set utf8;

用的字符是汉字“范”,gbk编码为B7 B6,utf8编码为E8 8C 83

用下面的SQL语句插入数据

mysql> insert into t1 values( ‘范’);

a)如果终端设置为utf8,并且执行了 set names utf8,那么插入到数据库中的就是“范”这个字的utf8编码,这个过程中MySQL不需要做编码转换。写入数据库的内容可以通过执行 select hex( c1 ) from t1 得到数据的十六进制编码来验证。

b)如果终端设置为 utf8,并且执行了set names gbk,那么执行完这个插入操作后,写入的二进制数据是E9 91 BC,这是“汉字“鑼”的utf8编码。这是因为,终端输入的“范”用的是utf8编码,而服务器以为终端发送过来的内容是gbk编码,所以在向t1表中插入的时候进行了一次gbk到utf8的转换,结果当然是错误的。

c)如果终端设置为gbk,并且执行了set names gbk,那么执行完插入操作后,写入t1的依然是“范”这个字的utf8编码。插入过程中,终端输入的是“范”的gbk编码B7 B6,服务器被告知终端发过来的SQL语句是gbk编码(由character_set_client指定),所以在插入数据前做了一次gbk到utf8的编码转换。

d)如果终端设置为gbk,并且执行了set names utf8,那么执行完插入操作后,MySQL会报出一个数据被截断的警告。实际上,输入终端的是“范”这个字符的gbk编码B7 B6,而服务器被告知客户端发过来的SQL语句是utf8编码,所以在执行过程中没有做转码,直到插入数据的时候,发现B7 B6不符合utf8的编码规则,给出了警告信息,实际插入的数据是3F 3F,也就是两个问号。

查询的时候是同样的道理,MySQL也是根据set names设定的字符集来对返回给客户端的结果集做相应的编码转换,如果转换的结果和终端显示的字符集一致,就能正确显示,如果不一致就是乱码。

结论是,只要终端的字符集和set names指定的字符集一致就可以让MySQL在处理过程中执行正确的转码并且正确地显示。

另外,如果通过程序操作MySQL数据库, 那么也需要事先执行set names命令来指定程序希望输出的字符集。比如,用程序从一个utf8编码的数据库向另外一个gbk编码的数据库进行数据迁移,在选取源数据库数据之前,需要执行set names gbk,才能取到gbk编码的数据。
分享到:
评论

相关推荐

    设定mysql字符集解决终端乱码

    本文将详细介绍如何通过设定 MySQL 的字符集来解决终端乱码的问题。 #### 一、理解 MySQL 字符集相关变量 在 MySQL 中,有多个与字符集相关的系统变量,这些变量决定了数据在客户端和服务端之间的传输以及存储方式...

    Ubuntu15.10使用mysql 5.6.28中文乱码问题解决.docx

    在Ubuntu 15.10操作系统中安装并使用MySQL 5.6.28时,可能会遇到中文乱码的问题。这通常与字符集配置有关,影响到数据的正确存储和显示。以下是一份详细的解决方案,旨在帮助你解决这个问题。 首先,我们需要检查...

    解决msql中文乱码问题.pdf

    在MySQL中,中文乱码问题通常是由于字符集设置不正确导致的。字符集决定了数据库、表和字段如何存储和显示非ASCII字符,如中文。在上述文档中,讲解了如何在MySQL中创建、修改和删除数据库及表,并解决中文乱码问题...

    MySQL数据库 中文设置

    首先,我们需要理解MySQL字符集的概念。字符集(Character Set)是数据库用来表示文本的一组符号和规则,它定义了如何存储和处理字符。对于中文环境,最常用的字符集是`utf8`或`utf8mb4`,它们支持广泛的中文字符。 ...

    MySQL存储数据乱码的问题解析

    MySQL存储数据乱码的问题解析,通常涉及到字符集配置和数据传输过程中的编码转换。字符集在MySQL中扮演着至关重要的角色,特别是在处理非ASCII字符,如中文时。MySQL的字符集设置包括服务器级别、数据库级别、表级别...

    mysql使用source 命令乱码问题解决方法

    MySQL中的乱码问题通常涉及到字符集设置,尤其是在跨平台的数据迁移过程中。这个问题主要出现在两个环节:数据导出和数据导入。在本例中,我们面对的是一个从Windows系统导出的SQL文件,在Ubuntu系统中导入时遇到的...

    PHP中文乱码处理总结.docx

    当在命令行或控制台环境中查看MySQL的字符集设置时,如果出现乱码,可以通过`show variables like 'charac%'`查询MySQL的字符集配置。确保命令行环境支持UTF-8编码,例如在Windows中,可能需要修改控制台的代码页...

    在CMD中操作mysql数据库出现中文乱码解决方案

    通常,MySQL的数据表、数据库以及连接都会有自己的字符集设定,如`character_set_server`、`character_set_database`和`character_set_connection`等。可以通过执行`SHOW VARIABLES LIKE 'character%'`来查看MySQL的...

    MySQL命令行界面中出现字符错误提示的原因及解决方法

    总之,理解和正确配置字符集是避免MySQL字符错误的关键。务必保持系统、数据库、终端和文件之间的编码一致性,以确保数据的正确存储和处理。在遇到类似问题时,按照上述步骤检查和调整配置通常能够解决问题。

    Linux php 中文乱码的快速解决方法

    对于MySQL,创建数据库和表时,应选择支持UTF-8的字符集,如`utf8mb4`,并确保在连接时指定正确的字符集。 总之,解决Linux PHP环境下的中文乱码问题需要从多个角度考虑,包括PHP配置、Web服务器配置、HTML文件、...

    Linux SecureCRT显示乱码解决方案

    2. **设置字符集**:接着,转到“终端” -> “仿真” -> “VT特性”标签页,在“字符集”部分,选择“GB2312”。这是因为GB2312是中国大陆常用的一种汉字编码标准,可以较好地处理中文字符。不过,如果你的服务器...

    mysql命令行还原phpMyAdmin导出的含有中文的SQL文件

    在MySQL数据库管理中,有时我们需要将通过phpMyAdmin导出的SQL文件还原到数据库中,特别是当文件包含中文字符时,处理字符集问题显得尤为重要。本篇文章将详细讲解如何使用MySQL命令行工具来完成这个任务。 首先,...

Global site tag (gtag.js) - Google Analytics