我正在导入一个csv文件,其中包含另一个人发送给我的用户数据。该文件是在多人之间来回发送的,与不同操作系统上的不同程序一起工作。所以发生了一些编码问题,我发现没有 easy 方法来修复它(是的,我将文件转换为UTF-8等)。
数据存储在postgresql数据库中,我找到了一种转换破碎字符的方法。
例如:
â€\ u0088 \ u009 =ü
â€@ä§=ä
â€\ u0088 \ u0088 \ u0088 \ u0088 =ö
......
在 psql 中,我使用以下语句将â\u0088\u009Aº
转换为ü
:
SELECT COUNT(*) FROM sbl_students WHERE lastname ~* E'.*â\\u0088\\u009Aº.*';
=> 61
UPDATE sbl_students SET lastname = regexp_replace(lastname, E'â\\u0088\\u009Aº', 'ü', 'g');
SELECT COUNT(*) FROM sbl_students WHERE lastname ~* E'.*â\\u0088\\u009Aº.*';
=> 0
我尝试将其实现为 php 脚本,但由于某种原因它无效。 没有任何内容被替换,也不会发生错误。
$dbh = pg_connect("dbname=iserv user=sbl");
$query = "UPDATE sbl_students SET lastname = regexp_replace(lastname, E'â\\u0088\\u009Aº', 'ü', 'g');";
pg_query($dbh, $query);
pg_close($dbh);
我已经尝试了多种变体,例如regexp_replace(lastname, E'â\u0088\u009Aº', 'ü', 'g')
或regexp_replace(lastname, 'â\u0088\u009Aº', 'ü', 'g')
但其中没有变化。
有人可以帮帮我吗?我不明白为什么查询在psql中工作得很好但在php中没有做任何事情。
谢谢!
Postgresql 8.4
PHP 5.3.3-7 + pushze16 with Suhosin-Patch(cli)
答案 0 :(得分:0)
你可以试试这样的东西吗?
$replacements = array(
'â\u0088\u009Aº' => 'ü',
'â\u0088\u009A§' => 'ä',
'â\u0088\u009Aâ\u0088\u0082' => 'ö',
// ...
);
$lastname = str_replace(array_keys($replacements), array_values($replacements), $lastname);
答案 1 :(得分:0)
自己找到答案。您必须使用 pg_prepare():
$dbh = pg_connect("dbname=iserv user=sbl");
pg_prepare($dbh, "", "UPDATE sbl_students SET lastname = regexp_replace(lastname, $1, 'ü', 'g');");
pg_execute($dbh, "", array("â\u0088\u009Aº"));
pg_close($dbh);
仍然不明白为什么:/