我在尝试此查询时收到此错误
SQLSTATE[HY000]: General error: 1270 Illegal mix of collations (latin1_spanish_ci,IMPLICIT), (latin1_bin,NONE), (utf8_unicode_ci,COERCIBLE) for operation 'replace'
这是我的查询
$codigoRadicado = DB::table('radicado')
->leftJoin ('dependencia','radicado.Dependencia_idDependencia', "=", 'dependencia.idDependencia')
->leftJoin ('serie','radicado.Serie_idSerie', "=", 'serie.idSerie')
->leftJoin ('subserie','radicado.SubSerie_idSubSerie', "=", 'subserie.idSubSerie')
->select (DB::raw("CONCAT(abreviaturaDependencia, codigoSerie, codigoSubSerie,LPAD((MAX(REPLACE ( codigoRadicado , CONCAT(abreviaturaDependencia, codigoSerie, codigoSubSerie), '' ))+1),10,'0')) as codigoRadicado"))
->where ('radicado.Dependencia_idDependencia', "=", $request['Dependencia_idDependencia'])
->where ('radicado.Serie_idSerie', "=", $request['Serie_idSerie'])
->where ('radicado.SubSerie_idSubSerie', "=", $request['SubSerie_idSubSerie'])
->get();
答案 0 :(得分:0)
MySQL正在执行SQL语句时抛出错误。错误消息表明问题发生在'替换'操作中。
这似乎指向REPLACE()函数可能是罪魁祸首。
REPLACE( codigoRadicado , CONCAT(abreviaturaDependencia,codigoSerie,codigoSubSerie) , '' )
这似乎与错误消息对齐,表明字符集/排序规则存在差异
(latin1_spanish_ci,IMPLICIT), (latin1_bin,NONE), (utf8_unicode_ci,COERCIBLE)
我们不确定,但我们怀疑归类的顺序与REPLACE函数的参数顺序相同。
但是错误表明我们有一个“混合”的排序规则,MySQL不会违反它的“强制性”规则。
此类问题的典型解决方法是识别每个表达式的排序规则,然后在显式转换中包装一个(或多个)表达式。 CONVERT(foo USING collation)
对于字符串文字,我们可以使用快捷方式并指定字符集(获取默认排序规则),例如_latin1'foo'
要获取表达式中使用的每个列的字符集和排序规则,可以检查表定义。 SHOW CREATE TABLE的输出应该显示出来。 (如果未在列上指定,则表示创建表时分配的默认值。(如果在创建表时未指定,则默认为分配给数据库的值。)
参考:http://dev.mysql.com/doc/refman/5.7/en/charset-collation-expressions.html
每个字符集都有默认排序规则。我们可以使用查询找到每个字符集的默认排序规则...
SELECT * FROM information_schema.charactersets
我们可以获得另一个查询的完整列表清单......
SELECT * FROM information_schema.collations
MySQL还提供了一个COERCIBILITY函数,可以帮助我们调试问题,帮助我们确定哪个列或文字表达式不能被“强制”为不同的排序规则。
参考:http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_coercibility
(我不确定是否有任何问题回答了你提出的问题,因为我不确定是否存在实际的问题。我只是猜测你打算提出问题例如“为什么会抛出这个错误?”,而你不只是发布状态报告。)