`
xiegs2007
  • 浏览: 16385 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

PHP连接MySQL出现乱码的一些个人看法(转載)

 
阅读更多

 

作者:不祥


PHP连接MySQL的过程中如果出现乱码很多人会说,用"Set names '??'"就能解决问题,但很多时候还是会出现各种怪现象,比如说页面能正常存取,但是phpmyadmin不能正常存取等现象。小弟经过验证,产生了一些个人看法,欢迎大家讨论和指正。

MySQL数据库操作过程中出现了三种字符集:
1、页面字符集(也就是 content="TEXT/HTML; CHARSET=GBK")
2、连接字符集(也就是 "Set names 'GBK'")
3、字段字符集(无论是库还是表的字符集,将最终反映到字段上)
一、实验:
1、情况一
数据库字段字符集:utf-8
连接字符集:没有显式设置,默认为latin1
页面字符集:gbk

存入过程:
1)页面用GBK表示的SQL向服务器提交存入请求;
2)默认情况下(不用Set Names '??')服务器用latin1打开连接;
3)服务器误认为当前的SQL语句是用latin1表示的;
4)服务器将GBK字符当作latin1字符,错误的运用“latin1转UTF-8函数”将字符转换后存入UTF-8字段中;
5)( 错误的latin1(其实是GBK) => 错误的UTF-8)
6)如果用phpmyadmin打开该表(用utf8连接)将会看到该字段为乱码;

读取过程:
1)默认情况下(不用Set Names '??')服务器用latin1打开连接;
2)服务器将UTF-8字段中的值转换为latin1返回给客户端;
3)(错误的UTF-8 => 错误的latin1(其实是GBK))该过程为存入过程5的逆过程。(刚好错错得对了)
4)将服务器误认为是latin1的GBK编码按页面字符集正常显示;

用示意图来表示就是:

CODE
   存入过程:
   ----------------------
   页面    连接     存储
   ----------------------
   GBK => latin1 => utf-8
          ---------------
   ------------- |
         |       +------- 该过程得到的utf-8是一串不知所云的乱码,但MySQL固执的认为这串码为UTF-8
         |
         +------ MySQL将GBK误认为是latin1

   读取过程:
   ----------------------
   页面    连接     存储
   ----------------------
   GBK <= latin1 <= utf-8
          ---------------
   ------------- |
         |       +------- 正是这串乱码经过逆过程转换回正确的GBK编码,只是MySQL认为是latin1而已
         |
         +------ MySQL将误认为是latin1的GBK编码传回了页面,刚好得到正确的编码。
2、情况二
数据库字段字符集:utf-8
连接字符集:gbk
页面字符集:gbk

文字描述略。


示意图:

CODE
   存入过程:
   ----------------------
   页面   连接   存储
   ----------------------
   GBK => GBK => utf-8
          ------------
   ------------- |
         |       +------- 该过程得到的utf-8是由GBK转换而来的,是正确的utf-8编码
         |
         +------ 页面字符集等于连接字符集,MySQL认为页面传递给它的是GBK编码,它的想法正好符合事实。


   读取过程:
   ----------------------
   页面   连接   存储
   ----------------------
   GBK <= GBK <= utf-8
              ---------------
   ------------- |
         |       +------- 用“utf-8转GBK函数”将正确的utf-8编码转换回GBK
         |
         +------ 页面字符集等于连接字符集,显示没有任何问题。

3、情况三
数据库字段字符集:gbk
连接字符集:没有显式设置,默认为latin1
页面字符集:gbk

CODE
   存入过程:
   ----------------------
   页面   连接   存储
   ----------------------
   GBK => latin1 => GBK
          ------------
   ------------- |
         |       +------- 字符被“latin1转GBK函数”转换的成了乱码,但MySQL认为它是GBK,所以工具无法正常显示。
         |
         +------ MySQL认为页面传递给它的是latin1编码,它将在后续过程中画蛇添足地将正确的GBK转换为乱码。


   读取过程:
   ----------------------
   页面   连接   存储
   ----------------------
   GBK <= latin1 <= GBK
          ---------------
   ------------- |
         |       +------- “GBK转latin1函数”将乱码转换为GBK,但MySQL却认为它们是latin1
         |
         +------ 错误的latin1编码其实是正确的GBK编码,页面显示正常,但工具显示不正常。


二、字符集之间的转换
笔者试着将GBK字符误当作latin1转换为错误的utf-8能成功,逆过程中将乱码转换回latin1得到的刚好是正确的GBK

CODE
   $str = "中文测试";
   $str_tran = iconv('latin1', 'utf-8', $str);
   echo $str_tran; // 显示乱码,既不是GBK也不是utf-8和latin1


   echo "<br>-----------<br>";


   $str_re_tran = iconv('utf-8', 'latin1', $str_tran);
   echo $str_re_tran;  // 显示 “中文测试”


而将GBK字符误当作utf-8转换为错误的GBK编码则出现错误
CODE
   $str = "中文测试";
   #$str_tran = iconv('utf-8', 'gbk', $str);    // 错误!!!


可见一种编码是否能被当作另一种编码被转换为第三种编码,取决于编码的固有属性,上面我们举的第一个例子只是碰巧GBK编码能被误当作latin1被转换为utf-8。如果是如下情况,则数据库肯定不能正常存取数据。
GBK => utf-8 => GBK(未实验)
三、结论
页面能正常存取但phpmyadmin不能正常存取,从严格意义上来说应该是一种错误,页面是否能正常存取取决于连接字符集是否能正常的被转换为存储字符集。
要保证页面能正常存取,并且工具也能正常使用,一般保持页面字符集等于或兼容连接字符集就可以了。
分享到:
评论

相关推荐

    解决连接mysql中文显示乱码

    以下是对如何解决连接MySQL时中文显示乱码问题的详细解析。 ### 解决中文显示乱码的关键知识点 #### 1. **理解字符集和编码** 字符集(Character Set)是指用于表示文字的一系列符号集合,而编码(Encoding)则是将...

    解决knime连接mysql数据库中文乱码

    然而,在连接 MySQL 数据库时, Knime 经常会出现中文乱码问题。今天,我们将解决这个问题,并详细讲解相关的知识点。 Knime 的编码格式 Knime 的默认编码格式是 GBK,這是中國大陸通用的中文编码格式。然而,...

    彻底解决C# asp.net连接MySQL乱码问题

    本文将详细介绍如何彻底解决使用C# ASP.NET 应用程序连接 MySQL 数据库时出现的乱码问题。 #### 一、问题背景与分析 在开发基于 C# ASP.NET 的应用程序时,如果涉及到 MySQL 数据库的使用,可能会遇到中文字符显示...

    PHP+MySql中文乱码解决办法

    在不同的操作系统中,文件名的编码方式可能存在差异,这会导致一些文件操作函数(如`move_uploaded_file()`、`filesize()`、`readfile()`等)出现乱码问题。为了解决这类问题,可以采取以下措施: - **Windows环境*...

    PHP+MySql中文乱码解决方案

    6. **PHP连接MySQL时指定的编码不正确**:在PHP脚本中连接MySQL时,如果没有正确指定编码,也会引起乱码问题。 #### 三、解决方案 针对以上提到的乱码原因,我们可以通过以下步骤来逐一解决: ##### 1. PHP网页的...

    mysql数据库乱码解决

    本文将深入探讨MySQL数据库乱码问题的根源、解决方案,以及如何避免未来出现类似问题,确保数据的正确读取与显示。 ### MySQL数据库乱码问题解析 #### 1. **乱码产生的原因** 在MySQL中,乱码通常发生在数据存储...

    在DELPHI中使用MyDAC连接MySQL数据库时中文显示乱码的解决方法

    本文将详细介绍如何解决在DELPHI中使用MyDAC连接MySQL数据库时出现的中文乱码问题。 #### 原因分析 中文乱码问题通常由以下几个方面的原因引起: 1. **客户端与服务器端编码不一致**:DELPHI客户端与MySQL服务器...

    MySQL乱码解决方案数据库乱码

    2. **客户端连接字符集设置错误**:客户端(如PHP应用)连接到MySQL时没有正确设置字符集,导致数据传输过程中出现乱码。 3. **数据库、表或字段的字符集不一致**:如果数据库、表或字段的字符集设置不一致,也会...

    java插入mysql中文乱码解决

    在使用Java应用程序与MySQL数据库交互的过程中,常常会遇到一个令人头疼的问题:中文字符在存储到数据库时出现乱码现象。这种现象通常发生在使用JDBC(Java Database Connectivity)连接数据库,并进行数据插入操作...

    mysql乱码解决方法

    当从MySQL 4.1以下版本升级到4.1及以上版本时,可能会出现字符集兼容性问题,导致乱码。解决方法包括: - 确保所有数据库、表、字段的字符集设置为UTF-8。 - 如果是从非UTF-8编码的数据导入,需要先将数据文件...

    Mysql中文乱码问题完美解决方案.doc

    ### MySQL中文乱码问题及其解决方案 #### 背景与问题描述 在使用MySQL数据库的过程中,用户经常会遇到中文字符显示为“???”的问题,即所谓的“乱码”现象。这种情况通常发生在导入导出数据库、更换不同的...

    MySQL数据库—乱码总结

    在使用MySQL数据库的过程中,字符集设置不当可能会导致数据存储或查询时出现乱码问题。本文将针对MySQL数据库中的乱码现象进行深入分析,并提供相应的解决策略。 #### 二、MySQL数据库乱码概述 MySQL数据库中的...

    mysql汉字乱码问题

    这主要涉及到字符编码设置不正确,导致在存储或显示汉字时出现乱码。在MySQL中,字符集是用来定义如何存储和处理字符的规则,它包括服务器级别的字符集、数据库级别的字符集、表级别的字符集以及字段级别的字符集。...

    Kettle推送数据到Mysql数据库表时乱码.docx

    然而,在使用 Kettle 将数据推送到 Mysql 数据库表时,可能会出现乱码问题。本文将详细介绍 Kettle 推送数据到 Mysql 数据库表时乱码的原因和解决方案。 乱码原因 -------- 在 Kettle 中进行数据抽取时,如果抽取...

    Linux下MySQL解决乱码问题

    如果客户端连接时仍然出现乱码问题,还需要检查客户端连接参数中的字符集设置。可以通过命令行工具或应用程序来指定字符集,例如: ```sql mysql -uroot -p --default-character-set=utf8 ``` - **表结构与...

    解决 docker mysql 中文乱码问题

    使用 docker 启动 mysql 容器可能会出现中文乱码的情况,这里记录如何制作支持中文的 mysql 镜像 docker版本:18.06 mysql 版本:5.7 1. 创建 my.cnf 文件 [client] default-character-set=utf8 [mysql] default-...

    MySql数据库导入乱码

    解决 MySql 数据库导入中文乱码的问题需要正确设置字符集,并在数据库连接文件中指定字符集。只有这样,我们才能正确地导出和导入 MySql 数据库。 在实际操作中,我们需要注意以下几点: 1. 在导出数据库时,需要...

    MySQl处理乱码

    在"MySql链接处理乱码.txt"文件中,可能包含了关于如何在建立MySQL连接时设置字符集以避免乱码的具体步骤和示例。例如,使用Java的JDBC连接MySQL时,可以设置URL参数`useUnicode=true`和`characterEncoding=utf8`来...

    hibernate+mysql乱码问题

    本文将深入探讨“hibernate+mysql乱码问题”的原因、解决方案以及如何预防这类问题。 首先,我们需要了解乱码问题的根源。在数据库层面,MySQL的编码格式对数据存储和检索至关重要。如果数据库、表或列的字符集不...

    PHP向mysql插入中文乱码问题,php文件内容写入数据库!

    在PHP开发过程中,遇到中文...总之,解决PHP向MySQL插入中文乱码问题,需要确保数据库、PHP连接、文件编码以及数据处理过程中的编码一致性。遵循以上步骤,可以有效地避免中文乱码问题,确保数据正确无误地写入数据库。

Global site tag (gtag.js) - Google Analytics