You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:00:58