0

我正在为调用数据库以报告数据的 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编辑以包括在两个数据库中也使用排序规则指定表列。

使用第一条评论中的链接,我使用了“显示表状态”和“显示变量,如“collat​​ion_database”。

显示表状态确认每个表的排序规则在我的和其他系统上都是 latin1_swedish_ci。

显示 collat​​ion_database 等变量确认我的系统和其他系统都将 latin1_swedish_ci 作为值

4

1 回答 1

0

至于我的研究,默认排序规则和字符集已从 MySQL-server 5.0 更改为 5.1。

请尝试将以下行添加到您的 my.cnf 并重新启动您的服务器:

character_set_client=utf8
character_set_server=utf8
collation_server=utf8_general_ci

并检查问题是否仍然存在。我的问题是,客户端可以使用自己的字符集或排序规则请求字符串,直到没有服务器为客户端定义的字符集。

请注意,在最后的 MySQL 版本中,参数名称略有更改。我正在使用 MySQL 5.5,上述参数对我来说工作正常,从那时起我没有任何非法的排序规则混合错误。

于 2014-07-17T15:24:40.153 回答