我正在为调用数据库以报告数据的 C# 应用程序运行代码。有趣的是,该报告在我自己的 PC 上运行良好,但在客户端使用时,我得到:
concat 中的排序规则 (latin1_swedish_ci,IMPLICIT) 和 (utf8_general_ci,COERCIBLE) 的非法混合
到目前为止,我已经检查了表 ( ENGINE=InnoDB DEFAULT CHARSET=latin1;
),这在我们的两个数据库之间是相同的。此外,我可以备份客户端数据库,在我自己的 PC 上恢复它并运行代码,它工作正常。
我怀疑这将是与 MySQL 相关的错误,因为它们运行 MySQL Server 5.0,而我自己的计算机上有 MySQL Server 5.1。这两个版本之间是否有任何明显的差异或其他明显的地方会导致另一台 PC 上的错误,而不是我自己的?
这是有问题的代码,我能够修复:
原来的:
"Case when s.type in (" + IDList + ") then concat(s.id,(case when coalesce(p.ID, ps.ID) in ('ABC') then '.M' else '.U' end)) else case when s.id is NULL OR s.other_id='' then s.symbol else s.id end end as 'BLAH' "
修复分摊:
"Case when s.type in (" + IDList + ") then concat(CAST(s.id as CHAR),(case when coalesce(p.ID, ps.ID) in ('ABC') then '.M' else '.U' end)) else case when s.id is NULL OR s.other_id='' then s.symbol else s.id end end as 'BLAH' "
这会是由 MySQL 在他们的 PC 上使用的默认字符集引起的吗?my.ini 文件确实有一个额外的区别,这是我指定的:
'character-set-server=latin1'
而只有包含:
'default-character-set=latin1'
latin1_swedish_ci
编辑以包括在两个数据库中也使用排序规则指定表列。
使用第一条评论中的链接,我使用了“显示表状态”和“显示变量,如“collation_database”。
显示表状态确认每个表的排序规则在我的和其他系统上都是 latin1_swedish_ci。
显示 collation_database 等变量确认我的系统和其他系统都将 latin1_swedish_ci 作为值