项目使然,需要用laravel框架开发。写到DB保存数据的时候,因为之前有前辈封装好了关于DB的一些常用操作,就直接拿过来用了。前辈写的是使用save添加的时候会做一步过滤无用列的操作,那么,这里就需要获取某个表的所有字段,用来对比当前字段是否在表中存在,不存在则需要过滤掉,然后使用了laravel框架封装好的Schema::getColumnListing()这个方法。
到这里,问题出现了???使用getColumnListing()获取到的字段一直是空的!!!纳尼?既然是空的,那就往深处去走走,一步一步debug看看问题出在了那里。一步一步走下去,走到底了,还是没有发现问题到底出在了哪里。嗯?这就有点儿意思了。明明有问题,但是没有找出来,不行,我再看看!看着看着,找到上一步没有走到的一个类:
class MySqlProcessor extends Processor
{
/**
* Process the results of a column listing query.
*
* @param array $results
* @return array
*/
public function processColumnListing($results)
{
$mapping = function ($r) {
$r = (object) $r;
return $r->column_name;
};
return array_map($mapping, $results);
}
}
打印一下,好像发现了一点儿问题:进来这个函数的时候,$result这个变量是正确的,但是最后return的时候所有数据变成NULL了。嗯哼?逗我,进入闭包函数,打印再看看。这里打印$r出来之后,发现出来的数据是COLUMN_NAME,但是,后面获取的时候,变成column_name了,所以return的时候成null值了。问题的源头找到了,把这里的$r->column_name改成$r->COLUMN_NAME之后,数据正常了。
但是总感觉怪怪的,哪里怪呢?回头再想想,不对,这是laravel框架本身的东西,这个东西不知道多少人在用呢,应该不是简单的框架问题!!!那是啥问题呢?再思考一下,对了,我的数据库版本用的是MySQL8.0的最新版本,那是不是版本问题呢?赶紧去切换MySQL版本,切到5.7,将之前的程序改回去,再跑一下,WOC?结果正确的?版本问题?这么坑?花半天时间,就这么个问题?不行,还是要深究一下,不然半天时间白白浪费了!拿到sql语句,看一下本质的区别:
SELECT column_name FROM information_schema.columns WHERE table_schema = 'database' AND TABLE_NAME = 'table'
这是mysql5.7获取到的结果: 再看看mysql8.0获取到的结果
看到差别了吗?同样的sql语句,获取到的columu_name字段结果是不一样的,5.7获取到的是小写的,8.0的获取到的是大写的。
原来是这么一回事!!!算了先到这里吧!我去消化消化,瞅瞅mysql官方是咋说的,先把这个东西记录下来,为了自己后面不会那么容易忘记,也为了猿们少走一点儿弯路!!!