Невозможно использовать COPY FROM для загрузки буквы «E» в столбец CHAR (1) в PostgreSQL из файла CSV

#postgresql #csv

#postgresql #csv

Вопрос:

Моя таблица выглядит так:

 CREATE TABLE IF NOT EXISTS metering.service_point (
service_point_id int GENERATED ALWAYS AS IDENTITY NOT NULL PRIMARY KEY,
service_point_number varchar (20) NULL,
property_id int NULL,
fuel_type char (1) NULL,
ldz_id smallint NULL,
gsp_id smallint NULL,
supply_start_date timestamp NULL,
supply_end_date timestamp NULL);
 

Я вставляю данные из CSV, которые выглядят следующим образом:

 service_point_number, property_id, fuel_type, gsp_id, ldz_id, supply_start_date
'1717209598220',1,'E',8,,'20180428'
 

Используя эту команду:

 COPY metering.service_point (service_point_number, property_id, fuel_type, gsp_id, ldz_id, supply_start_date)
FROM 'C:BillingDataservice_point.csv'
DELIMITER ','
CSV HEADER;
 

Это четвертая таблица в процессе пакетной загрузки, и первые три прошли нормально. Этот сбой с: value too long for type character(1)

Однако, если я скопирую содержимое НЕПОСРЕДСТВЕННО из CSV и вставлю его в INSERT запрос, например:

 INSERT INTO metering.service_point (service_point_number, property_id, fuel_type, gsp_id, ldz_id, supply_start_date)
SELECT '1717209598220',1,'E',8,NULL,'20180428';
 

Тогда все работает нормально.

Я предполагаю, что это должно быть ошибкой. Я могу обойти это, установив значение равным NULL, а затем исправив его позже. Я также могу обойти проблему, изменив тип данных для fuel_type , но это кажется немного грустным.

Наверное, я просто упускаю что-то простое, может быть, что-то связанное с юникодом — например E , в моем CSV на самом деле считается 2 символа по какой-то странной причине?

Комментарии:

1. Я только что просмотрел это, и я уверен, что кто-то поймет ,, , что проблема в том, что это не так, это работает как NULL , и я попробовал это со значением там, и оно все равно не сработало

2. Почему вы используете одинарные кавычки вокруг значений? По умолчанию используются двойные кавычки, как описано здесь: postgresql.org/docs/current/sql-copy.html

3. Да, это сработало. Я думал, что одинарные и двойные кавычки взаимозаменяемы, и действительно, они отлично работали для моих первых двух файлов. Теперь я знаю лучше — спасибо!

4. Кроме того, единственное место, где я вижу двойные кавычки, упомянутые в этой документации, — это пустое строковое значение. Не стесняйтесь говорить мне, что я ошибаюсь 😉

5. ЦИТАТА «ЦИТАТА Указывает символ, заключающий в кавычки, который будет использоваться при цитировании значения данных. По умолчанию используется двойная кавычка. Это должен быть один однобайтовый символ. Эта опция разрешена только при использовании формата CSV. »