MySQL特定的字符导致'illegal mix of collations'错误

3

我之前没有特别遇到过这个问题,但是

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 服务器上引起常规错误了。
有没有任何关于什么是正确的字符集和排序规则的共识呢?

1
你不需要用引号封装值吗?where 'thing' = 'خ@gmail.com' - Mark Overton
你应该始终使用utf8mb4 - Rain
嗨,我正在使用Laravel的DB ::,而且那只是错误消息的输出,而不是实际使用的查询。 Laravel正在处理“引号”。 - ZCT
1
当Laravel使用预处理语句输出失败的查询时,它不会显示值周围的引号。这使得通过复制/粘贴查询到命令行进行故障排除变得困难,因为您必须手动添加引号。 - aynber
检查表/列的定义。它应该是utf8_unicode_ci,但可能设置为latin1_swedish_ci。 - aynber
显示剩余2条评论
1个回答

0

连接和列定义都需要使用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的超集。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接