首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Oracle迁移到PostgreSQL编码错误

从Oracle迁移到PostgreSQL编码错误
EN

Stack Overflow用户
提问于 2017-05-25 18:04:39
回答 1查看 494关注 0票数 0

我正在将数据从oracle数据库迁移到postgresql数据库。我遇到了一个问题,我使用存储过程从oracle导出数据,然后将其导入postgresql。当我尝试将数据导入postgresql时,我收到以下错误:

错误:编码“UTF8”的字节序列无效: 0xcb 0xcf上下文:复制项目,第810行

我发现由default设置的Oracle数据库将以ASCII编码,因此CSV文件通常以ASCII格式输出,而在Postgres DB中,默认情况下以不允许接受ASCII的UTF-8编码

因此,在将数据从Oracle导出到CSV文件时,我需要使用存储过程进行UTF-8编码,我在oracle上尝试了以下操作,但它不起作用。

代码语言:javascript
复制
CREATE OR REPLACE 
PROCEDURE export_main(dir VARCHAR2, file_name VARCHAR2)
  IS
 select_stmt VARCHAR2(100) := 'SELECT MTYPE || '','' || MNO FROM MAIN';
    cur INTEGER;
    file UTL_FILE.FILE_TYPE;
    row_value VARCHAR2(4000);
    ret INTEGER;
  BEGIN
    -- Open a cursor for the specified SELECT statement
    cur := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(cur, select_stmt, DBMS_SQL.NATIVE);
    ret := DBMS_SQL.EXECUTE(cur);

    -- All columns were concatenated into single value in SELECT
    DBMS_SQL.DEFINE_COLUMN(cur, 1, row_value, 4000);

    -- Open the file for writing
    --file := UTL_FILE.FOPEN(UPPER(dir), file_name, 'w', 32767);
file := UTL_FILE.FOPEN_NCHAR(UPPER(dir), file_name, 'w', 32767);
    -- Export rows one by one
    LOOP
       ret := DBMS_SQL.FETCH_ROWS(cur);
       EXIT WHEN ret = 0;

       -- Get the value
       row_value := NULL;
       DBMS_SQL.COLUMN_VALUE(cur, 1, row_value);

       -- Write the row to the file
      -- UTL_FILE.PUT_LINE(file, row_value);
UTL_FILE.PUT_LINE_NCHAR(file, TO_NCHAR(row_value));
    END LOOP;

     UTL_FILE.FCLOSE(file);
     DBMS_SQL.CLOSE_CURSOR(cur);

    EXCEPTION WHEN NOT_LOGGED_ON THEN
    DBMS_OUTPUT.PUT_LINE ('A program issues a database call without being connected to Oracle.');
  END;

或者,在postgres DB从CSV文件导入数据时,我需要使用存储的过程使用UTF-8进行编码这里是Postgres的脚本

代码语言:javascript
复制
begin
    set schema 'public';
    raise notice 'CSV PATH: %,TABLE NAME: %',csv_path,target_table;
   execute format('truncate %I ',target_table);
    execute format('copy %I from %L WITH (FORMAT csv)',target_table, csv_path);
    return;
end;

是否要查看CSV文件?

EN

回答 1

Stack Overflow用户

发布于 2017-05-25 20:46:04

您可以使用SET client_encoding='latin1'告诉postgres您正在发送的数据的编码。将latin1替换为oracle数据库中使用的编码。

postgres支持的字符集列表可以在here中找到。该列表还提到了SQL_ASCII,但由于ASCII码仅针对值0-127完全标准化,而不针对值128-255。因此,这些较高的值不能转换为UTF8,因为没有定义它们的含义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44177727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档