thinkphp mysql 中文_耗时5天解决thinkphp连接mysql中文乱码的问题
坑大,或者不大,它就在那里,等着你进。
先前修改成熟的一个基于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中文乱码的问题相关推荐
- navicat无法连接远程mysql数据库_[数据库]Navicat Premium 解决无法连接远程mysql数据库问题...
[数据库]Navicat Premium 解决无法连接远程mysql数据库问题 0 2018-07-18 00:00:15 问题原因 : 第一点 远程服务器数据库没有授权 第二点 远程连接数据库的端 ...
- sqlalchemy连接mysql数据库_史上超详细的flask_sqlalchemy连接mysql数据库
Python+Flask安装:https://www.jianshu.com/p/cd1925e90eda Flask路径参数以及请求参数讲解:https://www.jianshu.com/p/54 ...
- 0配置EF连接MySql数据库_第八节:EF Core连接MySql数据库
一. 前提 1.安装EF Core连接MySQL的驱动,这里有两类: (1).Oracle官方出品:MySql.Data.EntityFrameworkCore (版本:8.0.17) (2).其他第 ...
- jsp程序带mysql数据库_【web开发】:JSP连接Mysql数据库(非常详细,代码一看就懂)...
1,首先在自己新建的项目文本框中输入Web Project的名称,然后单击下一步. 2,继续单击下一步 3,把Generate web.xml deployment descriptor复选框勾上. ...
- mysql 换行_教你如何用Python 连接 MySQL
Hello,大家好,欢迎来到每周的Python小课堂,今天我们一起来聊聊如何用Python连接数据库. 一.普通 MySQL 连接方法 使用模块 MySQLdb 普通方式连接. execute() 返 ...
- 图书条码mysql数据库_中琅条码软件如何连接MySQL批量生成128码
原标题:中琅条码软件如何连接MySQL批量生成128码 中琅条码软件除了支持常见的TXT,CSV.Excel等文件类型数据库,还支持MySQL.SQLServer.Access等常用数据库.下面就以M ...
- 组态中怎么使用mysql数据库_组态王中PLC数据连接MySQL数据库教程
操作步骤: ① 确定中控室电脑连网,并且安装MySQL环境,下载地址如下:https://www.mysql.com/downloads/ ② 修改win MySQL服务信息(最好修改 ...
- python连接数据库mysql失败_解决python连接mysql报错问题
解决python连接mysql报错问题 最近跑python脚本时遇到一个问题,当sql语句中有中文时,执行python脚本报以下错误: Traceback (most recent call last ...
- 解决远程连接mysql很慢的方法(mysql_connect 打开连接慢)
解决远程连接mysql很慢的方法(mysql_connect 打开连接慢) 参考文章: (1)解决远程连接mysql很慢的方法(mysql_connect 打开连接慢) (2)https://www. ...
最新文章
- Echarts图表在VUE项目中使用动态数据源
- upload-labs-master文件上传靶场第七关详解
- travis-ci中的checkpatch工具使用
- Putty通过ssh代理连接远程服务
- 简单点儿、简单点儿、再简单点儿,其实世界可以不是我们想象的那么复杂
- 强大而优雅,API 研发管理 EOLINKER 新版正式发布!
- java new一个线程执行完后会自动销毁吗_Java基础总结,超级全的面试题
- eclipse + JBoss 5 + EJB3开发指南(3):使用Session Bean的本地接口
- 高性能javascript学习总结(2)--DOM编程
- Android对点击事件的处理
- openoffice将html转成pdf,通过openOffice将office文件转成pdf
- 不知道吧?未加工的食物可以帮助你减肥
- axios请求下载excel文件以及文件乱码问题
- 淘汰我们的不是这个时代,而是原地踏步的自己
- OCOD,用于MAX7456和STM32接口电平转换
- Python能不能只选择合并一个excel当中指定的sheet 当中指定的列呢?
- P1252 马拉松接力赛
- 从技术到应用实践 揭秘京东区块链布局全景
- 《天下无谋》读后感 --- 度心术卷2御心篇
- Q4财报一如既往增长稳健 陌陌为何能逆势增长?
热门文章
- STL 中map的用法详解
- linux清理备份日志,服务器日志清理备份
- mc服务器word文件夹,我的世界服务器创建:MC个人服务器创建流程
- mysql-bin磁盘满数据库重启不_liunx磁盘空间满了,导致mysql数据库无法启动
- elasticsearch 6.x (二) linux部署 kibana x-pack 安装
- python WindroseAxes 报错 has no attribute ‘Appender‘
- 新建用户、付权限命令
- 辽宁交通职业技术学校计算机好不好,辽宁省交通高等专科学校信息工程系
- 小白教你用Java生成验证码
- 树控件,多条件组合查询与混合数据源