0

我正在导入一个 csv 文件,其中包含另一个人发送给我的用户数据。该文件在多个人之间来回发送,在不同的操作系统上使用不同的程序。所以发生了一些编码问题,我发现没有简单的方法来修复它(是的,我将文件转换为 UTF-8 等)。

数据存储在 postgresql 数据库中,我找到了一种转换损坏字符的方法。

例如:
â\u0088\u009Aº = ü
â\u0088\u009A§ = ä
â\u0088\u009Aâ\u0088\u0082 = ö
...

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+squeeze16 和 Suhosin-Patch (cli)

4

2 回答 2

0

你可以试试这样的东西吗?

$replacements = array(
    'â\u0088\u009Aº' => 'ü',
    'â\u0088\u009A§' => 'ä',
    'â\u0088\u009Aâ\u0088\u0082' => 'ö',
    // ...
);

$lastname = str_replace(array_keys($replacements), array_values($replacements), $lastname);
于 2013-08-04T13:40:48.863 回答
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);

还是不明白为什么:/

于 2013-08-04T14:51:53.313 回答