【问题标题】:MySQL certain characters cause 'illegal mix of collations' errorMySQL某些字符导致“非法混合排序规则”错误
【发布时间】: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。

标签: php mysql laravel character-encoding collation


【解决方案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 的超集。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-03
    • 2017-10-19
    • 2010-11-17
    • 2012-08-28
    • 1970-01-01
    • 2013-08-01
    • 2011-03-03
    相关资源
    最近更新 更多