Python执行MySQL合并与拆分查询结果不一致问题排查
问题分析与解决方案
核心原因
分步执行时手动创建的临时表temp_pairs字段定义与合并执行时自动生成的不一致,尤其是**title字段的字符集/排序规则**,导致后续的BINARY模糊匹配逻辑失效。
合并执行中,CREATE TEMPORARY TABLE ... AS SELECT会自动继承原查询里fd.title的字符集、排序规则和字段长度;而分步执行时手动指定title VARCHAR(255),会使用数据库默认字符集,若与原表字段的字符集存在差异,BINARY修饰符强制按字节匹配时,相同文本的字节存储形式会不一致,最终导致匹配失败返回0条结果。
解决方案
方案1:同步临时表字段定义
手动创建temp_pairs时,完全对齐原表node_field_data.title的字段定义(包括字符集、排序规则和长度)。比如原表title为VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,则修改创建语句:
CREATE TEMPORARY TABLE IF NOT EXISTS temp_pairs ( nid INT(10) unsigned, title VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci );
方案2:复用CREATE ... AS SELECT逻辑
分步执行时直接用CREATE TEMPORARY TABLE ... AS SELECT创建临时表,避免手动定义字段的偏差。修改separate函数中的临时表创建逻辑:
# 替换原有的手动创建+executemany插入逻辑 cursor.execute(""" CREATE TEMPORARY TABLE IF NOT EXISTS temp_pairs AS SELECT fd.nid, fd.title FROM node__field_card_display cl JOIN node_field_data fd ON cl.entity_id = fd.nid AND cl.langcode = fd.langcode WHERE cl.field_card_display_target_id = 2049 AND cl.langcode = 'en' AND cl.bundle = 'person'; """)
此方式会让临时表字段定义与合并执行完全一致,后续匹配逻辑即可正常工作。
验证效果
修改后重新执行代码,separate函数的查询结果将与all_in_one一致,返回96条数据。
内容的提问来源于stack exchange,提问作者Jimbo
相关产品推荐
相关产品推荐

