ORDER_DELIVERY_COLLATION_FIX_GUIDE.md 3.8 KB

订单交付列表字符集校对错误修复指南

🔍 问题描述

错误信息

MySqlConnector.MySqlException: Illegal mix of collations 
(utf8mb4_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) 
for operation '='

错误位置OrderDeliveryService.cs:line 68

问题原因: 订单交付列表的 SQL 查询涉及多个表的 JOIN 操作,这些表中用于 JOIN 的字符串字段使用了不同的字符集校对规则(collation):

  • 部分字段使用 utf8mb4_general_ci
  • 部分字段使用 utf8mb4_unicode_ci

当 MySQL 尝试比较这些字段时,由于校对规则不一致而报错。

📋 涉及的表和字段

订单交付列表的复杂 SQL 查询涉及以下表的 JOIN 条件:

  1. crm_seordercrm_seorderentry

    • bill_noOrdNbr(ASNBOLShipperDetail)
  2. mes_moentrymes_morder

    • moentry_monomorder_no
  3. crm_seorderentrymes_moentry

    • item_numberproduct_code
  4. mes_moentry ↔ 其他业务表

    • moentry_monoWorkOrd(NbrMaster, NbrDetail)
    • moentry_monoWorkOrds(PeriodSequenceDet)
    • moentry_monopr_mono(srm_pr_main)
  5. crm_seorderentryYearDemandManagement

    • item_numberSAPItemNumber

🔧 解决方案

步骤1:诊断当前字符集状态

执行诊断脚本,查看所有涉及字段的当前字符集校对规则:

mysql -h localhost -u root -p aidopdev < d:\DEMONET\tools\sql\check_order_delivery_collations.sql

或者在 MySQL 客户端中:

source d:/DEMONET/tools/sql/check_order_delivery_collations.sql

步骤2:执行修复脚本

修复脚本会将所有涉及 JOIN 的字符串字段统一为 utf8mb4_general_ci

mysql -h localhost -u root -p aidopdev < d:\DEMONET\tools\sql\fix_order_delivery_collations.sql

或者在 MySQL 客户端中:

source d:/DEMONET/tools/sql/fix_order_delivery_collations.sql

步骤3:验证修复结果

修复完成后,刷新浏览器,重新点击"订单交付列表",应该可以正常加载数据。

📝 修复脚本说明

修复脚本会修改以下表的字段:

必定存在的表

  1. crm_seorder: bill_no, custom_no
  2. crm_seorderentry: item_number
  3. mes_moentry: moentry_mono
  4. mes_morder: morder_no, product_code
  5. ASNBOLShipperDetail: OrdNbr, ContainerItem
  6. PeriodSequenceDet: WorkOrds

可能存在的表(使用动态 SQL 判断)

  1. NbrMaster: WorkOrd
  2. YearDemandManagement: SAPItemNumber
  3. srm_pr_main: pr_mono
  4. NbrDetail: WorkOrd

⚠️ 注意事项

  1. 执行前备份:虽然此操作只修改字符集校对规则,不影响数据内容,但建议在生产环境执行前备份数据库。

  2. 影响范围:修改字符集校对规则可能会轻微影响这些字段的排序和比较行为,但 utf8mb4_general_ci 是 MySQL 最常用和兼容性最好的校对规则。

  3. 执行时间:对于大表,修改字段可能需要较长时间,建议在业务低峰期执行。

  4. 其他功能:如果系统中其他功能也涉及这些表的 JOIN 操作,修复后也会一并解决。

🎯 为什么统一为 utf8mb4_general_ci

  • 兼容性最好:MySQL 默认推荐的校对规则
  • 性能较高:比 utf8mb4_unicode_ci 排序和比较速度更快
  • 广泛使用:大多数 MySQL 应用使用此校对规则
  • ⚠️ 排序精度:对于某些特殊字符(如德语变音符号),排序精度略低于 utf8mb4_unicode_ci

对于中文和英文业务场景,utf8mb4_general_ci 完全满足需求。

🚀 执行后效果

修复完成后:

  • ✅ 订单交付列表可以正常加载
  • ✅ 所有涉及这些表的 JOIN 查询不再报字符集错误
  • ✅ 数据内容不受影响
  • ✅ 应用无需重启