2019-03-28


1、网站前端中文文字乱码主要原因有两点:

 (1)mysql数据库内部存储的数据本身处于乱码状态

 (2)前端与数据库传输数据的字符集与数据库内部字符集不一致导致

2、查找造成中文乱码原因

  登录数据库,查看数据库编码 

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
| collation_connection     | latin1_swedish_ci          |
| collation_database       | utf8_general_ci            |
| collation_server         | utf8_general_ci            |
+--------------------------+----------------------------+
 rows in set (0.01 sec)

  以上需要我们注意的参数有五个,分别是以下参数:

character_set_client             #主要用来设置客户端使用的字符集。
character_set_connection         #主要用来设置连接数据库时的字符集,如果程序中没有指明连接数据库使用的字符集类型则按照这个字符集设置。
character_set_database           #主要用来设置默认创建数据库的编码格式,如果在创建数据库时没有设置编码格式,就按照这个格式设置。
character_set_results            #数据库给客户端返回时使用的编码格式,如果没有指明,使用服务器默认的编码格式。
character_set_server             #服务器安装时指定的默认编码格式,这个变量建议由系统自己管理,不要人为定义。

  (1)查看使用的数据库的表格内中文字符是否乱码

  (2)查看连接数据库代码使用哪种字符集,是否与character_set_client;character_set_results ;character_set_connection一致

  然后排查原因

3、解决网站中文乱码

  首先,查看已经创建的数据库使用的默认字符集

mysql> select schema_name,default_character_set_name from information_schema.schemata where schema_name = 'test03';
+-------------+----------------------------+
| schema_name | default_character_set_name |
+-------------+----------------------------+
| test03      | utf8                       |
+-------------+----------------------------+
 row in set (0.00 sec)

  假如默认字符集不支持utf8编码,也就是数据库内的中文显示乱码,建议重新创建默认字符集为utf8的数据库,否则之后插入的中文数据仍然是乱码。以下是创建默认字符集为utf8的数据库命令

mysql> create database if not exists test03 default character set = 'utf8';
Query OK,  row affected (0.00 sec)

  假如数据库支持的默认字符集是utf8,那就修改数据库配置文件/etc/my.cnf内的以下参数

在[client]下添加

default-character-set=utf8

  然后重启数据库即可。当然,有很多文章修改的参数要多一个,如下

编辑/etc/my.cnf

在[mysqld]下添加

default-character-set=utf8

在[client]下添加

default-character-set=utf8

  为什么我们修改的参数要比较少呢,让我们实际分析一下

mysqld 下的default_character_set=utf8;,这个需要吗?答案是不需要

它的作用是:当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。可以使用--default-character-set设置字符集;

如果在CREATE TABLE语句中没有指定表字符集和校对规则,则使用数据库字符集和校对规则作为默认值。默认数据库的字符集和校对规则可以用作character_set_database和 collation_database系统变量。无论何时默认数据库更改了,服务器都设置这两个变量的值。如果没有 默认数据库,这两个变量与相应的服务器级别的变量(character_set_server和collation_server)具有相同的值。

大白话就是:如果你建表的时候没有指定字符编码,则会使用character_set_database,如果character_set_database也没有设值,则使用character_set_server

client 下的default_character_set=utf8; 它是需要的,可是它的作用是干吗的?

它的作用等同执行以下3个命令

SET character_set_client = utf8

SET character_set_results = utf8;

SET character_set_connection = utf8;

这3个参数的作用如下

  以上修改之后,基本不会出现中文乱码了,但是也有例外情况,那么遇到例外情况,该怎么做呢?

  这就要我们在配置Connection URL时,加上?useUnicode=true&characterEncoding=utf-8,这个配置有什么作用呢?

它的作用就是指定character_set_client和character_set_connection的值,而在jdbc链接中使用characterSetResults=UTF-8,即可设置character_set_results的值

但是如上所述,当你配置了client的default_character_set之后,characterEncoding和characterSetResults这两个变量你设置与否都不重要了。

  所以我们可以做一个结论:

  遇到中文乱码问题

  如果你只愿意配置服务器的话:

  在[client]下添加

  default-character-set=utf8即可

  如果你只愿意配置客户端的话:

  你可以使用jdbc:mysql://localhost:3306/test? characterEncoding=UTF-8&characterSetResults=UTF-8即可

4、已有的库和表更改为utf8

  以上的修改只对我们修改完成之后建立的数据库生效,对于已有的库和表是不产生影响的,需要我们单独进行转换

#更改数据库编码:
ALTER DATABASE 数据库名 CHARACTER SET utf8 COLLATE utf8mb4_general_ci;

#更改表编码:
ALTER TABLE 表名CONVERT TO CHARACTER SET utf8 COLLATE utf8mb4_general_ci;
如有必要,还可以更改列的编码

5、utf8与utf8mb4的区别(转载文章:https://www.cnblogs.com/beyang/p/7580814.html)

  MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。

  内容描述

那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。

  问题根源

最初的 UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。

utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode 中的基本多文本平面。

Mysql 中的 utf8 为什么只支持持最长三个字节的 UTF-8字符呢?我想了一下,可能是因为 Mysql 刚开始开发那会,Unicode 还没有辅助平面这一说呢。那时候,Unicode 委员会还做着 “65535 个字符足够全世界用了”的美梦。Mysql 中的字符串长度算的是字符数而非字节数,对于 CHAR 数据类型来说,需要为字符串保留足够的长。当使用 utf8 字符集时,需要保留的长度就是 utf8 最长字符长度乘以字符串长度,所以这里理所当然的限制了 utf8 最大长度为 3,比如 CHAR(100)  Mysql 会保留 300字节长度。至于后续的版本为什么不对 4 字节长度的 UTF-8 字符提供支持,我想一个是为了向后兼容性的考虑,还有就是基本多文种平面之外的字符确实很少用到。

要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以后的才支持(查看版本: select version();)。我觉得,为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8.  对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR  替代 CHAR。

参考文章:

https://www.cnblogs.com/beiyeren/p/3835412.html

https://blog.csdn.net/javandroid/article/details/81235387

centos 7 网站前端中文乱码分析、解决办法的更多相关文章

  1. C#中WebClient使用DownloadString中文乱码的解决办法

    原文:C#中WebClient中文乱码的解决办法 第一次尝试: string question = textBox1.Text.ToString(); WebClient client= new We ...

  2. 详解get请求和post请求参数中文乱码的解决办法

    首先出现中文乱码的原因是tomcat默认的编码方式是"ISO-8859-1",这种编码方式以单个字节作为一个字符,而汉字是以两个字节表示一个字符的. 一,get请求参数中文乱码的解 ...

  3. Source Insight 4 中文乱码的解决办法(source insight 3.5 及以下版本就到其他地方看看吧)

    干货:Source Insight 4 中文乱码的解决办法(source insight 3.5 及以下版本就到其他地方看看吧) [解决办法]: 菜单栏中[File]->[Reload As E ...

  4. IDEA使用maven构建时控制台中文乱码的解决办法

    使用maven clean install 项目时控制台中文乱码,解决办法如下: Setting->maven->runner VMoptions: -Dfile.encoding=UTF ...

  5. resin后台输出中文乱码的解决办法!

    resin后台输出中文乱码的解决办法! 学习了:https://blog.csdn.net/kobeguang/article/details/34116429 编辑conf/resin.con文件: ...

  6. php使用curl获取文本出现中文乱码的解决办法

    在使用php的curl获取远程html文本时出现了中文乱码. 解决办法的代码如下: $url = "www.ecjson.com";//获取页面内容$ch = curl_init( ...

  7. get请求和post请求参数中文乱码的解决办法

    get请求参数中文乱码的解决办法 在tomcat的server.xml里的Connector加个URIEncoding="UTF-8",把 <Connector connec ...

  8. CentOS中文乱码之解决办法

    在学习Linux的过程中,最先碰到的是通过SSH终端连接时发现有乱码出现,使用这篇文章先从这里说起. 在 ssh , telnet 终端中文显示乱码解决办法#vim /etc/sysconfig/i1 ...

  9. response重定向的网址中有中文乱码的解决办法

    在servlet都是使用response对象来重定向到另一个页面:response.sendRedirect("--").现在遇到一个问题,网页的地址是带中文的,当执行到跳转命令的 ...

随机推荐

  1. HTML5 桌面消息提醒

    Notification HTML5新属性,复制代码创建HTML文件,浏览器查看效果 <!DOCTYPE html> <html lang="en"> &l ...

  2. Web前后端数据交换技术和规范发展史:Form、Ajax、Comet、Websocket

    第一阶段:Form web应用想要与服务器交互,必须提交一个表单(form).服务器接收并处理该表单,然后返回一个全新的页面. 缺点:前后两个页面需要更新的数据可能很少,这个过程可能传输了很多之前那个 ...

  3. (字典树)Revenge of Fibonacci -- HDU -- 4099

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4099 要用c++交哦, G++ MLE 不是很懂,先粘上慢慢学习 代码: #include<std ...

  4. 【转发】在SQL Server中通过字段值查询存储该字段的表

    -- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.     -- Purpose: To search all colu ...

  5. 对java位运算之异或运算的一点记录

    首先,异或运算是,每个位上的数不同为1,相同为0. 其次,对两个数值变量的值进行三次异或运算就等于是交换了两个变量的值. 例如: int a = 4; int b = 10; a = a ^ b; b ...

  6. .net core 2.0 mvc 初步学习

    mvc_study *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !impor ...

  7. Kylin性能调优记——业务技术两手抓

    本文由  网易云发布. 作者:冯宇 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 背景 最近开始使用了新版本的Kylin,在此之前对于新版本的了解只是代码实现和一些简单的新功能测试,但是并没有 ...

  8. Android ScrollView 去掉 scrollbar 和 阴影

    1. 在 layout 里: android:scrollbars="none" android:overScrollMode="never" 2. 代码里 / ...

  9. Android 屏幕,语言,API版本 适配和兼容性

    Supporting Different Languages http://developer.android.com/training/basics/supporting-devices/langu ...

  10. django系列5.5--分组查询,聚合查询,F查询,Q查询,脚本中调用django环境

    一.聚合查询 aggregate(*args, **args) 先引入需要的包,再使用聚合查询 #计算所有图书的平均价格 from django.db.models import Avg Book.o ...