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', 'collation' => 'utf8_unicode_ci', ...]
请提供SHOW CREATE TABLE
讨论表。
如果您最后遇到乱码,请参阅Trouble with UTF-8 characters; what I see is not what I stored
叮当响的啤酒杯 (?) 需要 utf8mb4 而不是 utf8。 (utf8mb4 是 utf8 的超集。)
【讨论】:
以上是关于MySQL某些字符导致“非法混合排序规则”错误的主要内容,如果未能解决你的问题,请参考以下文章