错误信息:
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_ciutf8mb4_unicode_ci当 MySQL 尝试比较这些字段时,由于校对规则不一致而报错。
订单交付列表的复杂 SQL 查询涉及以下表的 JOIN 条件:
crm_seorder ↔ crm_seorderentry
bill_no ↔ OrdNbr(ASNBOLShipperDetail)
mes_moentry ↔ mes_morder
moentry_mono ↔ morder_nocrm_seorderentry ↔ mes_moentry
item_number ↔ product_codemes_moentry ↔ 其他业务表
moentry_mono ↔ WorkOrd(NbrMaster, NbrDetail)moentry_mono ↔ WorkOrds(PeriodSequenceDet)moentry_mono ↔ pr_mono(srm_pr_main)crm_seorderentry ↔ YearDemandManagement
item_number ↔ SAPItemNumber执行诊断脚本,查看所有涉及字段的当前字符集校对规则:
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
修复脚本会将所有涉及 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
修复完成后,刷新浏览器,重新点击"订单交付列表",应该可以正常加载数据。
修复脚本会修改以下表的字段:
crm_seorder: bill_no, custom_nocrm_seorderentry: item_numbermes_moentry: moentry_monomes_morder: morder_no, product_codeASNBOLShipperDetail: OrdNbr, ContainerItemPeriodSequenceDet: WorkOrdsNbrMaster: WorkOrdYearDemandManagement: SAPItemNumbersrm_pr_main: pr_monoNbrDetail: WorkOrd执行前备份:虽然此操作只修改字符集校对规则,不影响数据内容,但建议在生产环境执行前备份数据库。
影响范围:修改字符集校对规则可能会轻微影响这些字段的排序和比较行为,但 utf8mb4_general_ci 是 MySQL 最常用和兼容性最好的校对规则。
执行时间:对于大表,修改字段可能需要较长时间,建议在业务低峰期执行。
其他功能:如果系统中其他功能也涉及这些表的 JOIN 操作,修复后也会一并解决。
utf8mb4_unicode_ci 排序和比较速度更快utf8mb4_unicode_ci对于中文和英文业务场景,utf8mb4_general_ci 完全满足需求。
修复完成后: