regexp_replace中的转义字符串 - Postgresql& PHP

时间:2013-08-04 13:16:18

标签: php postgresql

我正在导入一个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)

2 个答案:

答案 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);

仍然不明白为什么:/