web开发中经常涉及前端网页——php——mysql之间的数据交互,当数据只有英文时通常不会有什么问题,但一旦涉及中文,三个地方的某一处字符编码不一致(如,网页使用的时gbk而mysql使用utf-8)就有可能导致乱码的出现。

(注:关于字符编码请参见百度百科:http://baike.baidu.com/view/1204863.htm?fr=aladdin)

前端网页编码:

通常我们都认为可以通过<head>标签内的<meta>项(如<META http-equiv="content-type" content="text/html; charset=xxx">)来设置整个页面的字符编码。大部分页面可以采用这种方式来告诉浏览器显示这个页面的时候采用什么编码,但是有的时候我们会发现有了这句还是不行,不管xxx是哪一种,浏览器采用的始终都是一种编码。

这种情况涉及到http协议通信中的头部(header)部分,实际上,用户浏览网页时,服务器发送给用户的内容不仅包括我们的网页(包括html/css/js这些代码内容),还包括被称为头部(header)的描述性内容,这些内容会告知客户端将要接收的数据的类型(是html还是纯文本还是多媒体文件等)、大小、来源等信息(如果想要看一下这些信息,可以使用telnet工具(而不是通过浏览器)按照http协议自己发起get等请求试试)。由于头部是优先于html发送的,<meta>作为html的一部分其优先级也低于头部,如果在头部中已经包含了有关网页字符编码的描述,浏览器最终就会按头部中说明的字符编码集来解析网页。

在php中,可以使用 header("content-type:text/html; charset=xxx"); 来发送关于字符集的头部。

而对于apache服务器来说,它具有一个AddDefaultCharset的功能,也就是会为每个发送的网页按照服务器默认的字符集设定好对应头部。

查看/etc/apache2/httpd.conf(2.4之前)或/etc/apache2/conf-available/charset.conf(2.4及以后),里面有一句AddDefaultCharset xxx如果这一句未处于注释状态,那么为每个网页添加默认字符集头部的功能就处于开启状态,此时单独设置<meta>标签里的字符集便没有效果。

注意:html页面所标明的编码方式应该与实际在编写html页面(其实就是纯文本)时保存所用的编码方式一致。

一般而言,为了兼容中文甚至更多的其它语言,使用utf-8编码方式是最省事的一种方式,因为utf-8几乎支持世界上的所有常用语言。

mysql数据库编码:

在终端下mysql -uusername -ppassword 后进入mysql的控制程序,再键入show variables like 'character%'; (注意往mysql终端中键入命令语句或sql语句时分号不可以省略)可以看到类似下图:

上面列举了mysql在各个层面上所使用的字符集,其中(*)

character-set-server/default-character-set:服务器字符集,默认情况下所采用的。
character-set-database:数据库字符集。
character-set-table:数据库表字符集。
优先级依次增加。所以一般情况下只需要设置character-set-server,而在创建数据库和表时不特别指定字符集,这样统一采用character-set-server字符集。
character-set-client:客户端的字符集。客户端默认字符集。当客户端向服务器发送请求时,请求以该字符集进行编码。
character-set-results:结果字符集。服务器向客户端返回结果或者信息时,结果以该字符集进行编码。
在客户端,如果没有定义character-set-results,则采用character-set-client字符集作为默认的字符集。所以只需要设置character-set-client字符集。

于是我们会发现,上图所示的character-set-server使用的不是utf8(注:在mysql中,utf-8编码方式的表示为utf8,没有“-”)。这是因为mysql默认的存储方式在没有修改的情况下就是latin1。在这种情况下,我们在使用mysql终端进行创建数据库和数据表的操作时,若在sql语句中没有指定所使用字符集,那么存储时使用的编码方式就会是latin1,明显,中文存放在这种本来用于存放拉丁文的编码方式下显示出来肯定是乱码。

那么怎么修改它呢,可以使用set character-set-server = utf8;(由于character-set-server优先级高,只修改它即可达到修改数据库存储编码方式的效果)。此后在终端里使用sql建表时表的存储编码方式即是utf-8。

但是,这个修改只对当前服务有效,使用quit;退出后再次进入mysql终端就会发现字符集又变回了latin1了。想要使修改永久生效的方法我目前找到的资料显示只有通过重新编译mysql时修改编译参数达到,如果有高手知道怎么不通过编译实现烦请留言告知。

php编码:

那么,说到了mysql,php在和mysql进行交互时要怎么保证传输数据过程中不出现乱码呢?

按照(*)处的描述,实际上,为了使得存入mysql和从mysql中取出数据时不出现乱码,我们只要使得以下三个系统参数设置为与服务器字符集character-set-server相同的字符集。 他们是:
character_set_client:客户端的字符集。
character_set_results:结果字符集。
character_set_connection:连接字符集。
设置这三个系统参数可以通过向MySQL发送语句:set names xxx (xxx可以是utf8)来实现

因此,当涉及从php往mysql发送中文等非英文字符时,在mysql_connect语句后使用mysql_query("set names utf8");语句(这里假设数据库存储用的是utf8)后就可以放心传送和取回中文了。

此外,由于html页面实际上也可能由php动态生成,怎么保证php动态生成的页面所使用的编码方式和头部或<meta>里声明的一样呢?

在php目录下找到php.ini文件修改default_charset = "utf-8“即可使得php在输出页面时使用utf-8来编码。

参考:

http://zhidao.baidu.com/link?url=u6hNAXaLxOYEcBIViascG2fgPRorVYQyN9eULCiVyNCKihlqUGJmCBOZWtp6KS8DO7UbWuCr3GeodvukDJLdQ_

http://niutuku.com/tech/Mysql/237673.shtml

转载于:https://www.cnblogs.com/applelife/p/10571135.html

前端网页、php与mysql数据库字符编码(解决中文等乱码问题相关推荐

  1. 设置mysql的字符编码解决中文乱码问题

    配置说明 mysql5提供了以下几个设置字符集的系统变量: character_set_client 客户端字符集 character_set_connection 客户端与服务器端连接采用的字符集 ...

  2. MYSQL数据库字符编码设置

    mysql字符集编码设置与查看命令 转自http://www.111cn.net/database/mysql/55781.htm 在mysql对字符编码的查看我们使用SHOW VARIABLES L ...

  3. mysql concat 不同字符集_字符编码 - 如何将整个MySQL数据库字符集和排序规则转换为UTF-8?...

    字符编码 - 如何将整个MySQL数据库字符集和排序规则转换为UTF-8? 如何将整个MySQL数据库字符集转换为UTF-8并将整理转换为UTF-8? 17个解决方案 591 votes 使用utf8 ...

  4. MySQL的字符编码体系(一)——数据存储编码

    安装MySQL好多次了,每次都会纠结于数据库的字符编码配置,所以我决定这一次彻底把它理清. MySQL的字符编码结构比較细,它慷慨向分为两个部分:数据存储编码和传输数据编码.本篇讨论数据存储编码部分, ...

  5. sql server schema下拉不到存储过程_mysql数据库字符编码总结--数据存储编码

    概述 MySQL的字符编码结构比较细,它大方向分为两个部分:数据存储编码和数据传输编码. 内容比较多,下面先简单介绍下数据存储编码~ 01 编码层次 数据存储的字符编码配置是指定数据库中存储的数据默认 ...

  6. 设置MySQL的字符编码

    前言 这里我已经将MySQL的数据库编码设置为UTF-8,所以下面现实的都是UTF-8. 设置MySQL数据库的编码方式有三种,分别是基于session会话的.基于全局gloable的.永久性改变的. ...

  7. mysql改utf8mb4后速度慢_更改MySQL数据库的编码为utf8mb4

    更改MySQL数据库的编码为utf8mb4 utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符. 采用utf8mb4编码的好处是:存储与获取数据的时候,不用再考虑微信昵称 ...

  8. mysql如何字符编码,如何修改MYSQL的字符编码

    如何修改MYSQL的字符编码 查看字符集设置 mysql> show variables like 'collation_%'; +----------------------+-------- ...

  9. mysql 编码格式_设置MySQL的字符编码

    前言 这里我已经将MySQL的数据库编码设置为UTF-8,所以下面现实的都是UTF-8. 设置MySQL数据库的编码方式有三种,分别是基于session会话的.基于全局gloable的.永久性改变的. ...

最新文章

  1. 怎么DIY一个粒子检测器
  2. LeetCode Longest Increasing Subsequence(动态规划、二分法)
  3. MySQL 分库分表与分区的区别和思考
  4. nginx配置动静分离简单配置示例
  5. img title属性值利用#13换行
  6. 实训09.08:简单的算法练习
  7. php 加密保存mysql_PHP及MYSQL中字符串加密函数
  8. SpringMVC 文件上传
  9. VB 获得磁盘的文件系统
  10. perl脚本中的ENDOFINPUT
  11. sqlserver基本增删查语句
  12. 师妹:3D视觉方向的招聘,有哪个比较好的社区呢?
  13. c# 条件编译 Conditional (DEBUG)
  14. matlab已知斜率画直线,MATLAB 霍夫变换 连接斜率相同的直线
  15. 修身养性的句子_关于修身养性的名言
  16. docker 配置 CA验证
  17. 全球及中国毫米波人体安检仪行业竞争格局分析与投资战略规划研究报告2022-2028年
  18. html5梯形图形代码,CSS秘密花园:梯形标签
  19. 华为OD社招Java岗面经,已OFFER
  20. 自然资源一体化平台(一站式服务平台)

热门文章

  1. day12-mysql 增删改查
  2. 恩布企业IM,协同办公平台发布V1.24.2版本
  3. Backbone的写类方式
  4. 产生一定范围随机数的通用算法公式
  5. HttpServlet详解
  6. 简要叙述matlab的含义,1,简述MATLAB组成部分? 2,说明使用M文件编辑/调试器的方法和优点? 3,存储在工作空间中的数组能编辑吗...
  7. idea ssm框架 mysql_idea搭建简单ssm框架的最详细教程(新)
  8. windows操作系统_如何正确使用windows操作系统?
  9. Python中的继承和多态
  10. 浅析linux容器--Docker