我有一个真正的噩梦从一个数据库解析数据,其中大部分文本已从Word粘贴到另一个数据库。数据需要每天通过解析器清洗,因此不仅仅是清理源数据一次。
问题在于目标在处理过程中不断移动,我的结果非常复杂。
该过程主要是复制从PHPMyAdmin生成的导出SQL;将其粘贴到表单中,然后运行解析脚本;然后,该脚本将“已清理”的数据保存到不同的数据库中。
数据中包含的内容包括......
等内容Comply with “Regulationsâ€?
理想情况下,这将是......
Comply with "Regulations"
当所有解析完成并存储在新数据库中时,我留下......
Comply with AS3868 â€Å"Regulationsâ€Â
还有其他单词字符,如elipsis等,但这个例子只显示了智能引号。
通过表单发布数据后,我清理数据的最佳方法是什么?
答案 0 :(得分:2)
这个问题最终要解决的问题远远超过听起来应该如此。基本上,数据在没有明确定义的编码环境的各种过程中破坏。基本上,数据是双重编码,因为它被解析,以便“成为”,然后变成•, < / p>
This thread极大地帮助了解环境问题以及如何确保PHP,MySQL和我的编码环境都使用UTF-8作为其默认值。
This site非常适合测试和修复mysql环境。该页面的代码在服务器上运行良好(使用SSL访问和更改)。我在本地使用WAMP服务器,但代码在那里运行不正常。我最终对my.ini文件进行了以下更改
[client]
...
default-character-set=utf8
[wampmysqld]
...
character-set-server=utf8
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'
然后我需要修复那里的数据。
我只是用安全的单字节字符替换有问题的代码(“将”)但最后我决定确保多个字节字符已更正,以便在被视为UTF-8时显示。
我不想信任脚本来编码搜索和替换字符串,我发现了一个很好的起点here。我使用MySQL的UNHEX函数来控制这个方面:
-- Single quotes
UPDATE table SET column = REPLACE(column, UNHEX('C3A2E282ACCB9C'), UNHEX('E28098'));
UPDATE table SET column = REPLACE(column, UNHEX('C3A2E282ACE284A2'), UNHEX('E28099'));
-- Double quotes
UPDATE table SET column = REPLACE(column, UNHEX('C3A2E282ACC593'), UNHEX('E2809C'));
UPDATE table SET column = REPLACE(column, UNHEX('C3A2E282ACC29D'), UNHEX('E2809D'));
-- Em and En dashes
UPDATE table SET column = REPLACE(column, UNHEX('C3A2E282ACE2809C'), UNHEX('E28094'));
UPDATE table SET column = REPLACE(column, UNHEX('C3A2E282ACE2809D'), UNHEX('E28094'));
为确保一切正常,我拿了一份表格,然后将所有已更改的多字节字符替换为单个字符
UPDATE table SET column = REPLACE(column, UNHEX('E28098'), "'");
UPDATE table SET column = REPLACE(column, UNHEX('E28099'), "'");
UPDATE table SET column = REPLACE(column, UNHEX('E2809C'), '"');
UPDATE table SET column = REPLACE(column, UNHEX('E2809D'), '"');
UPDATE table SET column = REPLACE(column, UNHEX('E28093'), '-');
UPDATE table SET column = REPLACE(column, UNHEX('E28094'), '-');
然后运行此MySQL脚本以捕获仍包含多字节字符的所有记录:
SELECT * FROM table WHERE LENGTH(column) != CHAR_LENGTH(column);
这是我能够快速找到现有数据中的异常情况。
希望这可以帮助其他人尝试跨不同系统传输数据。