我使用Percona,MySQL(来自Oracle)和Aurora(来自AWS)在AWS上运行SaaS系统。我们严重依赖存储过程和存储函数,前端是使用MySQL .NET连接器连接的.NET应用程序。所有环境在数据库,存储过程等方面都是相同的,但是托管不同的客户端数据(我基本上是按客户端空间分片)。
该系统已有几年历史,但正在不断积极发展。
最近升级到Percona之后,我们开始从percona服务器获取随机错误,存储的函数不存在。这些功能确实存在,并且错误会自行消失。它们在一天中随机弹出。这些问题不会发生在配置相同,结构相同,代码相同的MySQL或Aurora服务器上。
要尝试解决此问题,请升级到percona服务器5.6.27。问题并没有消失,但是在升级之后,我们开始使用一段代码来解决字符集问题,这些代码会连接一组很长的整数并通过存储的函数调用返回一个中间文本。如果我们在返回的结果上运行find_in_set,则会因UTF8字符集错误而死亡。
e.g。在存储过程中,失败的代码看起来像这样:
declare list mediumtext;
set list:=fn_getMyBigText();
if find_in_set(123,list) then
select 'worked';
end if;
错误是这样的:
Incorrect string value: '\xF2\x00\x00\x00\x00\x00...' for column 'list' at row 1
您可以对变量进行选择并在Workbench或命令行中查看它,并显示它具有正确的数据,只有在find_in_set()中使用它时才会失败
所有字符集变量都设置为utf8,所有排序规则都设置为uf8_general_ci。代码库没有改变。即它在升级之前立即工作,之后立即失败。在Aurora和MySQL上运行相同的代码就可以了。所有数据库,表和列都设置为utf8,看不到其他字符集。
我尝试将代码转换为使用mediumblob而不是mediumtext,因为blob没有字符集的概念并且错误仍然存在。这就像代码内部正在进行隐式转换为latin1。
如果没有关闭percona,那还有什么我错过的吗?我错过了一些设置?
感谢。