Moodle 1.9 REPLACE打破utf8_unicode_ci字符串

时间:2012-06-20 20:34:27

标签: mysql corruption moodle

我正在测试Moodle站点升级,从1.9版到2.2版。在测试盒上,我创建了一个Moodle 1.9站点的副本。为了让网站在测试框架上工作,我要做的一件事就是将硬编码的URL更新为测试机器上的有效URL。为此,我使用Moodle 1.9中的admin / replace功能,即

http://mytestsite/admin/replace.php

在结果表单中,我指定要切换的URL。根据文档,这里的脚本将继续遍历Moodle安装中的所有表并运行如下所示的脚本:

UPDATE adodb_logsql 
SET    PARAMS = REPLACE(PARAMS, 'some_url', 'another_url')

更新过程似乎运行正常。但是,它具有以下非预期的副作用

保存在数据库中的网站中的某些内容在REPLACE过程中看起来已损坏:

Before: Welcome to Company’s Learning
After : Welcome to Company’s Learning 

根据MySQL的说法,REPLACE语句是multi-byte safe

我的问题:

  1. 我做错了什么?一个简单的REPLACE不应该有这些奇怪的副作用。
  2. 是否有一种简单的方法来消除伤害?
  3. 测试服务器: * IIS 7 * PHP 5.3.13 * MySQL Server 5.5

2 个答案:

答案 0 :(得分:1)

即使Moodle可以直接从1.9升级到2.2,如果有大量数据,它也不是100%安全的。

在最近的所有升级中,我都遵循这条路径:1.8到1.9,1.9到2.0,2.0到2.1和2.1到2.2。这个过程很繁琐,但它避免了数据损坏的任何风险。

答案 1 :(得分:0)

这里真正的问题是数据导出工具没有为utf-8导出添加BOM表头。在导入期间,导入器会解析几千行以检查编码,但它从不会遇到导致问题的行,因此假定编码不正确。