代码之家  ›  专栏  ›  技术社区  ›  Xie Steven

如何解决使用powershell执行psql和Copy命令时出现的乱码?

  •  0
  • Xie Steven  · 技术社区  · 3 年前

    我正在编写powershell脚本,用psql-copy命令将“csv”从客户端机器复制到远程postgre数据库表。

    复制命令执行成功,但有些日文字符出现了乱码。

    我已经设置了客户端和控制台stdin和stdout的编码,但仍然出现了乱码。

    [System.Console]::OutputEncoding = [Text.UTF8Encoding]::UTF8
    [System.Console]::InputEncoding = [Text.UTF8Encoding]::UTF8
    $env:PGPASSWORD = 'pwd';
    foreach($file in Get-ChildItem .\Import -Filter *.csv){
        $table = $file.BaseName
        $Truncate_Sql = "truncate table $table;"
        $Result = & psql -h 10.0.xxx.xx -d db1 -U user1 -w -c $Truncate_Sql
        Write-Host $Result  $table  "Ok."
        $Result =   Write-Output (Get-Content -Path $file.FullName -Encoding utf8) | & psql -h 10.0.xxx.xx -d db1 -U user1 -w -c "set client_encoding=UTF8;COPY $table FROM STDIN WITH(FORMAT CSV,HEADER TRUE, ENCODING 'UTF8')"
        $Result
    }
    

    例如,csv(utf8编码)内容如下所示

    header1,header2
    1001,その他
    

    当复制到postgre时,我使用pgAdmin来查看表数据。它显示:

    头1 头2
    1001 ???
    0 回复  |  直到 3 年前
        1
  •  0
  •   Xie Steven    3 年前

    我解决了我的问题。我混淆了PostgreSQL COPY 使用psql的命令 \COPY 指示

    实际上,我需要使用 \副本 指令执行复制命令,然后我可以直接从 文件 而不是写信给 stdin 。

    [System.Console]::OutputEncoding = [Text.UTF8Encoding]::UTF8
    [System.Console]::InputEncoding = [Text.UTF8Encoding]::UTF8
    $env:PGPASSWORD = 'pwd';
    foreach($file in Get-ChildItem .\Import -Filter *.csv){
        $table = $file.BaseName
        $Truncate_Sql = "truncate table $table;"
        $Result = & psql -h 10.0.xxx.xx -d db1 -U user1 -w -c $Truncate_Sql
        Write-Host $Result  $table  "Ok."
        $Result = & psql -h 10.0.xxx.xx -d db1 -U user1 -w -c "\COPY $table FROM $($file.FullName) WITH(FORMAT CSV,HEADER TRUE, ENCODING 'UTF8')"
        $Result
    }
    
    推荐文章