坑大,或者不大,它就在那里,等着你进。

先前修改成熟的一个基于thinkphp3.1.2的后台框架,里面有我的autoCode,本来在新项目上不想再用这么落后的版本,但考虑到后台项目不对外使用,重点是autoCode是我的进度保证,于是继续使用了这个版本。

本地开发环境是windows + phpstudy(apache,php5.4),数据库直接用线上的mariadb10.2,一切在本地就绪,可当我把这个后台项目放进线上容器(centos7 + apache + php5.4)里,满心欢喜的打开在线地址观看时,竟然发现网页中的一部分中文变成了英文问号,经过短暂的分析即刻得出:数据库里读出来的中文乱码了,而模板输出的中文是正常的。

这首先排除了页面编码的问题,而且代码在本地运行时一切正常,与线上用的是同一个数据库,因此数据库也不存在问题。

需要强调的是:

1、我给所有人要求过代码文件必须使用utf8无bom

2、每个html文件都有这段

3、数据库,表及字段全是utf8,且数据库里的中文内容是正常的

4、thinkphp的config.php里面已经加入了'DB_CHARSET' => 'utf8'

我检查了许许多多的配置文件,php的和apache的,连无辜的mariadb也没有放过。显式的配置了各种与编码相关的配置项,但问题并没有解决。

深深的疑惑使我尝试过许许多多的做法,我怀疑了很多不该怀疑的东西,除了人生。

我在php入口文件里加了header("Content-type: text/html; charset=utf-8");

我还把thinkphp3.1.2的/Lib/Driver/Db/DbMysql.class.php中的

mysql_query("SET NAMES '".C('DB_CHARSET')."'", $this->linkID[$linkNum]);

改为了

mysql_query("SET NAMES 'utf8'", $this->linkID[$linkNum]);

然而这都是无用功。

其实非常明显,这就是php连接mariadb时的编码有问题,我一次又一次的把目光投向了apache、php和mariadb的配置文件,特别是mariadb的/etc/my.cnf.d/server.cnf,[mysqld]加入了:

character_set_server=utf8

init_connect = 'SET collation_connection = utf8_general_ci'

init_connect = 'SET NAMES utf8'

其他几个配置文件该加default-character-set = utf8的也都加了。

乱码依旧。

痛定思痛,我冷静下来,经验告诉我,也许问题就在某个被自己认为没有问题而忽视掉的地方。

于是我把以上每项又检查了一遍。

是该做点别的尝试了,于是我检查了centos7的语言环境,并安装了中文语言包。

我的期待并没有得到满足,乱码还在。

对了我刚开始还让另一个php工程师在相同环境下的另一个项目里去读同一个数据库里的中文,结果并没有乱码。

而且我直觉一定是哪个地方使得这个后台项目中php使用了latin1或者别的编码去连接mysql。

第N次的痛定思痛,我一直都很确定这就是php使用了非utf8编码去连接mysql,但我在config.php里配置了呀,甚至还在DbMysql.class.php里写死了。

于是我用php做了一个验证:

dump(M()->query("SHOW VARIABLES LIKE '%char%'"));

dump(M()->query("SET NAMES 'utf8'"));

dump(M()->query("SHOW VARIABLES LIKE '%char%'"));

die;

这段代码在我本地毫无意外的,与mysql连接的编码都是utf8,而在线上的结果正如我所想,第一行打出来的结果里,character_set_connection、character_set_client、character_set_results这三个都是latin1,而在执行第二行后,第三行打印的结果就变成utf8了。

这表明我最后的结论是正确的,可是在哪里产生的这个问题呢?

于是我再一次打开thinkphp3.1.2框架的/Lib/Driver/Db/DbMysql.class.php文件,

把其中数据库版本大于4.1的if段注释掉,改成了判断mysql_set_charset函数是否存在的if段,如下:

$dbVersion = mysql_get_server_info($this->linkID[$linkNum]);

/*

if ($dbVersion >= '4.1') {

//使用UTF8存取数据库 需要mysql 4.1.0以上支持

mysql_query("SET NAMES '".C('DB_CHARSET')."'", $this->linkID[$linkNum]);

mysql_query("SET character_set_client = ".C('DB_CHARSET'), $this->linkID[$linkNum]);

mysql_query("SET character_set_results = ".C('DB_CHARSET'), $this->linkID[$linkNum]);

}*/

if (function_exists('mysql_set_charset') === false) {

mysql_query("SET NAMES '".C('DB_CHARSET')."'", $this->linkID[$linkNum]);

}else{

mysql_set_charset(C('DB_CHARSET'), $this->linkID[$linkNum]);

}

问题到此解决。

我先是震惊,问题居然这么简单,就是$dbVersion >= '4.1'这个判断没进去,于是我想起了我用的是mariadb10.2,确实按照字符串来对比版本的话,这盘算我输。

线上把$dbVersion这个变量打出来看了下,确实是 string(19) "10.2.12-MariaDB-log"

我又疑惑了,那我本地也是用的这同一个库啊,难道?

我在本地也打印了下$dbVersion,结果竟然是 string(25) "5.5.5-10.2.12-MariaDB-log"

这个疑问先留着,还有就是前面我明明在mariadb的server.cnf里配置了默认的连接编码,谁知道告诉我一声,我还是先把这个坑记录一下。

thinkphp mysql 中文_耗时5天解决thinkphp连接mysql中文乱码的问题相关推荐

  1. navicat无法连接远程mysql数据库_[数据库]Navicat Premium 解决无法连接远程mysql数据库问题...

    [数据库]Navicat Premium 解决无法连接远程mysql数据库问题 0 2018-07-18 00:00:15 问题原因 :  第一点 远程服务器数据库没有授权 第二点 远程连接数据库的端 ...

  2. sqlalchemy连接mysql数据库_史上超详细的flask_sqlalchemy连接mysql数据库

    Python+Flask安装:https://www.jianshu.com/p/cd1925e90eda Flask路径参数以及请求参数讲解:https://www.jianshu.com/p/54 ...

  3. 0配置EF连接MySql数据库_第八节:EF Core连接MySql数据库

    一. 前提 1.安装EF Core连接MySQL的驱动,这里有两类: (1).Oracle官方出品:MySql.Data.EntityFrameworkCore (版本:8.0.17) (2).其他第 ...

  4. jsp程序带mysql数据库_【web开发】:JSP连接Mysql数据库(非常详细,代码一看就懂)...

    1,首先在自己新建的项目文本框中输入Web Project的名称,然后单击下一步. 2,继续单击下一步 3,把Generate web.xml deployment descriptor复选框勾上. ...

  5. mysql 换行_教你如何用Python 连接 MySQL

    Hello,大家好,欢迎来到每周的Python小课堂,今天我们一起来聊聊如何用Python连接数据库. 一.普通 MySQL 连接方法 使用模块 MySQLdb 普通方式连接. execute() 返 ...

  6. 图书条码mysql数据库_中琅条码软件如何连接MySQL批量生成128码

    原标题:中琅条码软件如何连接MySQL批量生成128码 中琅条码软件除了支持常见的TXT,CSV.Excel等文件类型数据库,还支持MySQL.SQLServer.Access等常用数据库.下面就以M ...

  7. 组态中怎么使用mysql数据库_组态王中PLC数据连接MySQL数据库教程

    操作步骤: ①     确定中控室电脑连网,并且安装MySQL环境,下载地址如下:https://www.mysql.com/downloads/ ②     修改win MySQL服务信息(最好修改 ...

  8. python连接数据库mysql失败_解决python连接mysql报错问题

    解决python连接mysql报错问题 最近跑python脚本时遇到一个问题,当sql语句中有中文时,执行python脚本报以下错误: Traceback (most recent call last ...

  9. 解决远程连接mysql很慢的方法(mysql_connect 打开连接慢)

    解决远程连接mysql很慢的方法(mysql_connect 打开连接慢) 参考文章: (1)解决远程连接mysql很慢的方法(mysql_connect 打开连接慢) (2)https://www. ...

最新文章

  1. Echarts图表在VUE项目中使用动态数据源
  2. upload-labs-master文件上传靶场第七关详解
  3. travis-ci中的checkpatch工具使用
  4. Putty通过ssh代理连接远程服务
  5. 简单点儿、简单点儿、再简单点儿,其实世界可以不是我们想象的那么复杂
  6. 强大而优雅,API 研发管理 EOLINKER 新版正式发布!
  7. java new一个线程执行完后会自动销毁吗_Java基础总结,超级全的面试题
  8. eclipse + JBoss 5 + EJB3开发指南(3):使用Session Bean的本地接口
  9. 高性能javascript学习总结(2)--DOM编程
  10. Android对点击事件的处理
  11. openoffice将html转成pdf,通过openOffice将office文件转成pdf
  12. 不知道吧?未加工的食物可以帮助你减肥
  13. axios请求下载excel文件以及文件乱码问题
  14. 淘汰我们的不是这个时代,而是原地踏步的自己
  15. OCOD,用于MAX7456和STM32接口电平转换
  16. Python能不能只选择合并一个excel当中指定的sheet 当中指定的列呢?
  17. P1252 马拉松接力赛
  18. 从技术到应用实践 揭秘京东区块链布局全景
  19. 《天下无谋》读后感 --- 度心术卷2御心篇
  20. Q4财报一如既往增长稳健 陌陌为何能逆势增长?

热门文章

  1. STL 中map的用法详解
  2. linux清理备份日志,服务器日志清理备份
  3. mc服务器word文件夹,我的世界服务器创建:MC个人服务器创建流程
  4. mysql-bin磁盘满数据库重启不_liunx磁盘空间满了,导致mysql数据库无法启动
  5. elasticsearch 6.x (二) linux部署 kibana x-pack 安装
  6. python WindroseAxes 报错 has no attribute ‘Appender‘
  7. 新建用户、付权限命令
  8. 辽宁交通职业技术学校计算机好不好,辽宁省交通高等专科学校信息工程系
  9. 小白教你用Java生成验证码
  10. 树控件,多条件组合查询与混合数据源