【问题标题】:MySQL Query issue; Illegal mix of collations for operation 'like'MySQL 查询问题; 'like' 操作的排序规则的非法混合
【发布时间】:2018-12-05 13:51:12
【问题描述】:

我真的不知道我的以下查询做错了什么;

SELECT 
main.id as id, d.name as departmentName, s.name as sectionName, m.fullName as fullName, main.title as title, main.entryDate as entryDate 
FROM pre_tickets as main 

INNER JOIN pre_ticketscategory as d ON d.id = main.mainCategory_id 
INNER JOIN pre_ticketscategory as s ON s.id = main.category_id 
INNER JOIN pre_members as m ON m.id = main.member_id  

WHERE 

main.softDelete = '0' AND 
main.parent_id = '0' AND 
main.status = '0' AND 
(main.id LIKE '%my_query_ł%' OR d.name LIKE '%my_query_ł%' OR s.name LIKE '%my_query_ł%' OR m.fullName LIKE '%my_query_ł%' OR main.title LIKE '%my_query_ł%' OR main.entryDate LIKE '%my_query_ł%') 

ORDER BY main.id desc 
LIMIT 0, 25

错误

Illegal mix of collations for operation 'like'

所有 3 个表格都是(包括字段);

字符集: UTF-8

排序规则: utf_8_general_ci

我正在使用 PDO(我也直接从 PHPMYAdmin 和 Navicat 运行查询,结果相同)。我使用 UTF-8 进行连接(SET NAMES utf8 命令)。

我不使用JOINS时没有这个问题。

如果我删除 ł,那么一切都会按预期工作,没有错误。但是,如果我不这样做,我会收到错误消息。 UTF-8 字符集和 utf_8_general_ci 排序规则不应该支持这样的字符吗?

注意:

这是奇怪的部分;

  1. 如果我在查询中不使用 ł,那么我的查询会起作用

    (main.id LIKE '%my_query%' OR d.name LIKE '%my_query%' OR s.name LIKE '%my_query%' OR m.fullName LIKE '%my_query%' OR main.title LIKE '% my_query%' OR main.entryDate LIKE '%my_query%')

  2. 如果我在查询中使用 ł 并从查询中删除 main.id 和 main.entryDate 字段,那么我的查询仍然有效;

    (d.name LIKE '%my_query_ł%' OR s.name LIKE '%my_query_ł%' OR m.fullName LIKE '%my_query_ł%' OR main.title LIKE '%my_query_ł%')

  3. 如果我不使用 JOINs,我可以使用 ł 并且仍然在我的查询中保留 id 和 entryDate 字段,没有任何问题。

    SELECT id、title、entryDate FROM pre_tickets

    在哪里

    softDelete = '0' AND parent_id = '0' 和 状态 = '0' 和 (id LIKE '%my_query_ł%' OR title LIKE '%my_query_ł%' OR entryDate LIKE '%my_query_ł%')

    ORDER BY id desc 限制 0、25

idinteger 字段,而 entryDatedatetime 字段。

如果有人能解释我做错了什么以及如何解决这个问题,我会非常高兴?

【问题讨论】:

  • 你的字符是 UTF8 编码的吗?你从哪里得到的?
  • 您的连接使用什么字符集?
  • 我在我的问题中添加了一些细节。感谢您提出这些主题。 @Wrikken 我使用 UTF-8 字符集进行连接。 @马修;好吧,正如您在上面看到的那样,我直接从 PhpMyAdmin 运行查询。当我不使用连接时,相同的查询会按预期工作。
  • 原来问题出在main.id LIKE '%my_query_ł%'main.entryDate LIKE '%my_query_ł%'。 main.id 是 int,entryDate 是日期时间字段。我真的不明白为什么使用 Joins 会产生这样的问题,而没有 Joins 它不会。如果我从查询中删除它们,那么查询就可以了!如果我不删除它们但我不使用 ł 查询仍然有效!
  • @Revenant 我最终得到了几乎相同的结果:) 但是只删除日期时间字段对我有用。我对整数没有问题。

标签: mysql pdo


【解决方案1】:

由于没有答案,我决定回答我自己的问题;

我实际上并没有修复它,但我发现了问题并尽可能地使查询工作而不会出错。

我的解决方案是从查询中删除所有整数字段。这样我没有得到任何错误。这不是一个好的解决方案,但至少它仍然允许我搜索某些字段而不会出错。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2013-01-09
    • 2013-12-25
    • 2011-12-06
    • 1970-01-01
    • 2012-08-28
    • 2014-03-06
    相关资源
    最近更新 更多