一、报错信息及原因
错误输出信息,这是由于Mysql创建表时的字符集、排序规则方式和框架默认配置的不一致造成的:
- MySQL 5.5.3之后增加了utfmb4字符编码,以前PHP版本、Mysql版本低的时候习惯性选择:
- 资料表明,utf8和utfmb4差别不大,后者支持了一些emoji等特殊的字符,一般而言选谁都可以,我用laravel5.6版本的时候看到配置里默认使用utf8mb4:
General error: 1270 Illegal mix of collations (utf8_unicode_ci,COERCIBLE), (utf8_unicode_ci,IMPLICIT), (utf8mb4_unicode_ci,COERCIBLE) for operation
上述错误信息是由一下导致的,laravel操作数据表时报错:
return DB::update("UPDATE command SET response = CONCAT_WS('',response,?) WHERE id = ?",[$response, $id]);
//return DB::update("UPDATE command SET response = CONCAT_WS('',response,:response) WHERE id = :id",["response"=>$response, "id"=>$id]);
//CONCAT 遇到NULL即为NULL,所以选择CONCAT_WS替代。
上述语句过程就是将数据表已存在response值和最新传入的值拼接起来去更新,由于已存在的和最新的 配置不一致导致报错。
二、解决办法,框架配置和Mysql一致原则
1、如果是新项目,Mysql表还没有建立,使用如下,和框架默认的保持一致:
2、如果Mysql数据表已经建存在,老的数据表,那就修改框架里的配置,和Mysql保持一致:
最后:紧跟时代走,选择urf8mb4吧。。。。
关于它们的区别参考:Link