MySQL某些字符导致“非法混合排序规则”错误

Posted

技术标签:

【中文标题】MySQL某些字符导致“非法混合排序规则”错误【英文标题】:MySQL certain characters cause 'illegal mix of collations' error 【发布时间】:2020-04-24 01:45:02 【问题描述】:

我之前没有具体看到过这个问题,但是

SQLSTATE[HY000]:一般错误:1267 非法混合排序规则 (latin1_swedish_ci,IMPLICIT) 和 (utf8_unicode_ci,COERCIBLE) 用于操作“=”(SQL:

select `id` from `data` where `thing` = خ@gmail.com limit 1

我很确定 خ@gmail.com 不是有效的电子邮件地址,但我不太确定 Laravel 的 DB 函数为什么会将它传递给我的服务器。它不应该知道它正在使用的数据库的字符集和排序规则吗?将字符集和排序规则更改为 UTF-8 以便这不会在我的 mysql 服务器上导致一般错误是正确的解决方案吗?

对于正确的字符集和排序规则应该是什么达成共识?

【问题讨论】:

不需要用引号封装值吗? where 'thing' = 'خ@gmail.com' 您应该始终使用utf8mb4 嗨,我正在使用 Laravel 的 DB:: 并且这只是错误消息的输出,而不是正在使用的实际查询。 Laravel 正在处理“报价”。 当 Laravel 使用准备好的语句输出失败的查询时,它不会在值周围显示引号。很难通过将查询复制/粘贴到命令行来进行故障排除,因为您必须手动引用内容。 检查表/列的定义。它应该是 utf8_unicode_ci,但它可能设置为 latin1_swedish_ci。 【参考方案1】:

连接和列定义都需要为CHARACTER SET utf8(或utf8mb4)。从错误信息中,我看到其中一个显然是latin1

在 Laravel 的配置中:

在 config/database.php 文件中:'mysql' => [..., 'charset' => 'utf8', 'collat​​ion' => 'utf8_unicode_ci', ...]

请提供SHOW CREATE TABLE讨论表。

如果您最后遇到乱码,请参阅Trouble with UTF-8 characters; what I see is not what I stored

叮当响的啤酒杯 (?) 需要 utf8mb4 而不是 utf8。 (utf8mb4 是 utf8 的超集。)

【讨论】:

以上是关于MySQL某些字符导致“非法混合排序规则”错误的主要内容,如果未能解决你的问题,请参考以下文章

MySql 中的非法混合排序规则错误

当所有排序规则都已经标准化时,Mysql 非法混合排序规则

MySQL 非法混合排序规则

如何解决“非法混合排序规则”SQLException?

“非法混合排序规则”错误与 phpMyAdmin 的库存安装

使用 Ignited-Datatables 搜索时非法混合排序规则以进行“like”操作