pg_escape后出现 UTF8 错误 - Postgresql 和 PHP

UTF8 error after pg_escape - Postgresql and PHP

提问人:Charlo 提问时间:10/25/2023 最后编辑:Charlo 更新时间:10/25/2023 访问量:45

问:

我有以下一段代码,用于读取 txt 文件并将其导入 postgresql 数据库。我pg_escape_string用于所有可能包含特殊字符的文本字段。然后我把它导入数据库。全部成功。稍后,当我对相同的数据运行选择查询时,我收到 UTF8 错误。我检查了十六进制的错误代码,这是一个在我的数据中没有的字符。当我手动删除文本文件中的所有“并运行导入并再次选择查询时,一切正常。

我已经检查了堆栈溢出是否存在类似的错误,但找不到专门适用于pg_escape_string的答案,然后出现此错误。

关于如何在不手动删除 ' 并且没有收到错误的情况下运行导入的任何建议?

$val9 = pg_escape_string(trim($meterArr[$row][9]));
$val10 = pg_escape_string(trim($meterArr[$row][10]));
INSERT INTO "Meters"("AgentCode", "BuildingNr", "MeterNr", "Premises", "SortCode", "PrevReading", "DatePrev", "ConsumptionPrev", "Variance", "MeterName", "CurrOccupant", "MeterType", "MeterNoR","currReading","lastReadingDate","percConsumption","dailyAvg")
                VALUES ('$val0', '$val1', '$val2', '$val3', '$val4', '$val5', '$val6', '$val7', '$val8', '$val9', '$val10', '$val11', '$val12','$val13','$val14','$val15','$val16')
                ON CONFLICT ("AgentCode","BuildingNr","MeterNr") DO UPDATE SET 
                "Premises" = '$val3',
                "SortCode" = '$val4',
                "PrevReading" = '$val5',
                "DatePrev" = '$val6',
                "ConsumptionPrev" = '$val7',
                "Variance" = '$val8',
                "MeterName" = '$val9',
                "CurrOccupant" = '$val10',
                "MeterType" = '$val11',
                "MeterNoR" = '$val12',
                "currReading" = '$val13',
                "lastReadingDate" = '$val14',
                "percConsumption"='$val15',
                "dailyAvg"='$val16';

这只是代码的一个片段。

我尝试手动删除特殊字符,并尝试pg_escape_string。使用手动删除,一切正常,但使用字符串pg_escape则不然。

这是我用urlencode(pg_escape_string($data[5])))得到的输出,其中包含有问题的数据。 卑尔根%27%27s+家电+R

然后这是 txt 文件中的实际数据行。 “728”,“298”,“12”,“6998”,“00008”,“卑尔根电器R”,“62066.00”,“62066.00”,“.00”,“.00”,“.00”,“2019- 1-25”,“25- 1-2019”,“.00”,“.00”,“N”,“N”,“N”,“N”,“N”,“N”,“.00”,“.00”,“0”,“N”,“,”1“,”卑尔根电器R“,”卑尔根电器R“,”卑尔根电器R“,”??"," 0"

php postgresql UTF-8

评论

0赞 CBroe 10/25/2023
在这方面,存在与否实际上应该产生任何影响是没有意义的。难道这些实际上不是 - 而是看起来相似的东西,比如实际的反引号“或”?如果您的输入文本文件实际上没有以正确的 UTF-8 编码,那么这些问题是可以预料的。''
0赞 Charlo 10/25/2023
我想过这一点,但我在 VS Code 中打开了 txt 文件,并在删除撇号时专门搜索了它。
0赞 CBroe 10/25/2023
那么,对于这些有问题的值之一,回报是什么呢?(请在进行调试输出时应用一些类似的东西,以便我们可以看到其中的实际字节值,即使是“不可见”字符。pg_escape_stringurlencode
2赞 Frank Heikens 10/25/2023
从未使用过这个函数,我总是发现使用函数 pg_query_params() 更容易、更清晰。清理 PHP 代码、清理 SQL、不注入 SQL:php.net/pg_query_params
2赞 RiggsFolly 10/25/2023
如果将代码和数据放入问题中,则阅读代码和数据要容易得多。

答: 暂无答案