非法混合的归类MySQL错误在Query laravel中

时间:2016-04-13 21:58:10

标签: mysql laravel

我在尝试此查询时收到此错误

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();

1 个答案:

答案 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 collat​​ion)

对于字符串文字,我们可以使用快捷方式并指定字符集(获取默认排序规则),例如_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

(我不确定是否有任何问题回答了你提出的问题,因为我不确定是否存在实际的问题。我只是猜测你打算提出问题例如“为什么会抛出这个错误?”,而你不只是发布状态报告。)