【问题标题】:PostgreSQL csv import not working for only integerPostgreSQL csv导入不适用于仅整数
【发布时间】:2022-01-16 00:08:05
【问题描述】:

我在使用 PostgreSQL 14 时遇到以下问题 在具有最新更新的 Windows 10 上。

我需要在下表中插入值。

CREATE TABLE StateList (
    ID int GENERATED ALWAYS AS IDENTITY,
    State_Number int NOT NULL,
    ElectionGroup_ID INT NOT NULL,
    Election_Number int NOT NULL,
    UNIQUE (State_Number, ElectionGroup_ID, Election_Number),
    PRIMARY KEY (ID)
);

我要执行以下命令:

COPY StateList(Election_Number, State_Number, ElectionGroup_ID )
FROM '...\csvFileStateLists19.csv'
WITH (
    FORMAT CSV,
    DELIMITER ','
    );

“csvFileStateLists19”是

"19","9","4"
"19","5","238"
"19","5","21"
"19","15","1"
"19","5","10"

它适用于另一个使用字符串和整数的表。 但在这里我总是得到:

错误: FEHLER: ungültige Eingabesyntax für Typ integer: »19« 上下文:COPY statelist,Zeile 1,Spalte 选举号码:»19«

SQL 状态:22P02

这通常表示数字是空字符串或实际上不是数字。但它不是! 19岁了,为什么不行?

我在java中生成了文件, 它的 utf8 编码, 数据库是“German_Germany.1252”

显示客户端编码; => 统一码 显示服务器编码; => UTF8 选择 pg_encoding_to_char(encoding) 从 pg_database WHERE datname = 'database1'; => UTF8

select pg_encoding_to_char(encoding), datcollat​​e, datctype from pg_database where datname = 'database1';

返回 "UTF8" "German_Germany.1252" "German_Germany.1252"

感谢您的帮助!

【问题讨论】:

  • CSV 文件来自哪里?它的编码是什么?数据库的编码是什么?添加答案以更新您的问题。
  • 我用java生成了文件,它的utf8编码,数据库是……默认的?我认为 utf8
  • psqlshow lc_ctype ;
  • psql \encoding 返回什么?
  • UTF8 当我做 SHOW SERVER_ENCODING;

标签: sql postgresql csv


【解决方案1】:

嗯,根据您的输入,我收到了相同的错误消息 - 只是英语,而不是德语 - 我在 Vertica 中完成了它,它是 Stonebraker 的 PosgreSQL 的继任者,其 CSV 解析器的工作原理非常相似:

COPY statelist FROM LOCAL 'st.csv'  DELIMITER ',' EXCEPTIONS 'st.log';
-- error messages in "st.log"
-- COPY: Input record 1 has been rejected (Invalid integer format '"19"' for column 1 (State_Number)).
-- COPY: Input record 2 has been rejected (Invalid integer format '"19"' for column 1 (State_Number)).
-- COPY: Input record 3 has been rejected (Invalid integer format '"19"' for column 1 (State_Number)).
-- COPY: Input record 4 has been rejected (Invalid integer format '"19"' for column 1 (State_Number)).
-- COPY: Input record 5 has been rejected (Invalid integer format '"19"' for column 1 (State_Number)).                                                                                                    

嗯,这真的不足为奇。 "9" 是字符串文字,而不是 INTEGER 文字。它是由数字字母“9”组成的 VARCHAR(1),而不是 INTEGER。

尝试添加ENCLOSED BY '"' 子句。它对我有用:

COPY statelist FROM LOCAL 'st.csv'  DELIMITER ',' ENCLOSED BY '"' EXCEPTIONS 'st.log';
-- out  Rows Loaded 
-- out -------------
-- out            5

SELECT * FROM statelist;
-- out  State_Number | ElectionGroup_ID | Election_Number 
-- out --------------+------------------+-----------------
-- out            19 |                5 |              10
-- out            19 |                5 |              21
-- out            19 |                5 |             238
-- out            19 |                9 |               4
-- out            19 |               15 |               1                                                                                                                                                 

【讨论】:

  • 你错了,看我的“答案”。这就是为什么使用出现问题的程序(Postgres)很重要的原因。
【解决方案2】:

不是一个答案,只是证明 CSV 中的双引号数值不是问题:

cat csv_test.csv 
"19","9"
"19","5"
"19","5"
"19","15"
"19","5"


test(5432)=# \d csv_test 
              Table "public.csv_test"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 col1   | integer |           |          | 
 col2   | integer |           |          | 

select * from csv_test;
 col1 | col2 
------+------
(0 rows)

\copy csv_test from 'csv_test.csv' with  csv;
COPY 5

select * from csv_test;
 col1 | col2 
------+------
   19 |    9
   19 |    5
   19 |    5
   19 |   15
   19 |    5

所以现在也许我们可以继续寻找解决问题的答案。

【讨论】:

    猜你喜欢
    • 2017-01-12
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    相关资源
    最近更新 更多