nieprawidłowa sekwencja bajtów dla kodowania " UTF8"

Próbuję zaimportować niektóre dane do mojej bazy danych. Więc stworzyłem tymczasową tabelę,

create temporary table tmp(pc varchar(10), lat decimal(18,12), lon decimal(18,12), city varchar(100), prov varchar(2));

A teraz próbuję zaimportować Dane ,

 copy tmp from '/home/mark/Desktop/Canada.csv' delimiter ',' csv

Ale wtedy dostaję błąd,

ERROR:  invalid byte sequence for encoding "UTF8": 0xc92c
Jak to naprawić? Czy muszę zmienić kodowanie całej bazy danych (jeśli tak, to jak?) Czy Mogę zmienić tylko kodowanie mojej tmp tabeli? A może powinienem spróbować zmienić kodowanie pliku?
Author: Community, 2011-02-01

16 answers

Jeśli chcesz przechowywać dane UTF8 w swojej bazie danych, potrzebujesz bazy danych, która akceptuje UTF8. Możesz sprawdzić kodowanie swojej bazy danych w pgAdmin. Wystarczy kliknąć prawym przyciskiem myszy bazę danych i wybrać "Właściwości".

Ale ten błąd zdaje się wskazywać, że w Twoim pliku źródłowym są nieprawidłowe dane UTF8. Oznacza to, że narzędzie copy wykryło lub domyśliło się, że podajesz mu plik UTF8.

Jeśli używasz jakiegoś wariantu Uniksa, możesz sprawdzić kodowanie (więcej lub mniej) z file użyteczność.

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(myślę, że to zadziała również na komputerach Mac w terminalu.) Nie wiem jak to zrobić pod Windows.

Jeśli używasz tego samego narzędzia na pliku pochodzącym z systemów Windows (tj. pliku, który jest , a nie zakodowanym w UTF8), prawdopodobnie pokaże coś takiego:

$ file yourfilename
yourfilename: ASCII text, with CRLF line terminators

Jeśli sytuacja pozostanie dziwna, możesz spróbować przekonwertować dane wejściowe na znane kodowanie, aby zmienić kodowanie klienta lub jedno i drugie. (Jesteśmy naprawdę rozciąganie granic mojej wiedzy na temat kodowania.)

Możesz użyć iconv narzędzie do zmiany kodowania danych wejściowych.

iconv -f original_charset -t utf-8 originalfile > newfile

Możesz zmienić kodowanie psql (klienta) postępując zgodnie z instrukcjami Obsługa zestawu znaków . Na tej stronie wyszukaj frazę "aby włączyć automatyczną konwersję zestawu znaków".

 89
Author: Mike Sherrill 'Cat Recall',
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-11 20:03:57
psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';

Dodanie opcji encoding zadziałało w moim przypadku.

 40
Author: Nobu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-21 21:23:08

Najwyraźniej mogę po prostu ustawić kodowanie w locie,

 set client_encoding to 'latin1'

A następnie uruchom ponownie zapytanie. Nie jestem jednak pewien, jakiego kodowania powinienem używać.


latin1 sprawiły, że znaki były czytelne, ale większość znaków akcentowanych była w wielkich literach, gdzie nie powinny być. Założyłem, że było to spowodowane złym kodowaniem, ale myślę, że to rzeczywiście dane, które były po prostu złe. Skończyło się na zachowaniu kodowania latin1, ale wstępne przetwarzanie danych i Naprawiono problemy z obudową.

 9
Author: mpen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-23 20:44:54

Ten błąd oznacza, że kodowanie rekordów w pliku różni się w odniesieniu do połączenia. W tym przypadku iconv może zwrócić błąd, czasami nawet pomimo flagi / / IGNORE:

Iconv-f ASCII-t utf-8 / / ignoruj /a.txt

Iconv: nielegalna Sekwencja wejściowa na pozycji (pewna liczba)

Sztuczka polega na znalezieniu niewłaściwych znaków i zastąpieniu ich. Aby to zrobić na Linuksie Użyj edytora "vim":

Vim (Twój plik tekstowy), naciśnij przycisk" ESC": i wpisz": goto (liczba zwrócona przez iconv) "

Aby znaleźć znaki spoza ASCII, możesz użyć następującego polecenia:

Grep --color = 'auto' - P "[\x80 - \xFF]"

Jeśli usuniesz nieprawidłowe znaki sprawdź, czy naprawdę potrzebujesz przekonwertować swój plik: prawdopodobnie problem jest już rozwiązany.

 6
Author: Yuri Levinsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-11 09:07:13

To zależy od typu maszyny / kodowania wygenerowanego pliku importu.

Jeśli otrzymujesz go z angielskiej lub zachodnioeuropejskiej wersji systemu Windows, najlepszym rozwiązaniem jest ustawienie go na 'WIN1252'. Jeśli otrzymujesz go z innego źródła, zapoznaj się z listą kodowań znaków tutaj:

Http://www.postgresql.org/docs/8.3/static/multibyte.html

Jeśli otrzymujesz go z komputera Mac, być może będziesz musiał najpierw uruchomić go za pomocą narzędzia "iconv", aby Konwertuj go z Macromana na UTF-8.

 4
Author: BobG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-01 20:08:34

Cóż, miałem ten sam problem. A co rozwiązało mój problem to:

W Excelu kliknij Zapisz jako. Z opcji Zapisz jako typ wybierz .csv Kliknij na Narzędzia . Następnie wybierz web options z rozwijanej listy. W zakładce Encoding zapisz dokument jako Unicode (UTF-8) . Kliknij OK. Zapisz plik. Zrobione !

 4
Author: Vishal Chhatwani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-26 20:43:48

Znak ukośnika wstecznego można zastąpić, na przykład, znakiem rury, sed.

sed -i -- 's/\\/|/g' filename.txt
 2
Author: Richard Greenwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-14 22:23:11

Wykonaj poniższe kroki, aby rozwiązać ten problem w pgadmin:

  1. SET client_encoding = 'ISO_8859_5';

  2. COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;

 2
Author: Ramesh R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-29 17:33:40

Miałem ten sam problem i znalazłem tu dobre rozwiązanie: http://blog.e-shell.org/134

Jest to spowodowane niedopasowaniem w kodowaniu bazy danych, z pewnością dlatego, że baza danych, z której otrzymałeś zrzut SQL, została zakodowana jako SQL_ASCII, podczas gdy nowa jest zakodowana jako UTF8. .. Recode to małe narzędzie projektu GNU, które pozwala na zmianę kodowania danego pliku w locie.

Więc po prostu przekodowałem plik dumpfile zanim go odtworzyłem wstecz:

postgres> gunzip -c /var/backups/pgall_b1.zip | recode iso-8859-1..u8 | psql test

W systemach Debian lub Ubuntu, recode można zainstalować za pomocą pakietu.

 2
Author: Ed Doerr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-13 04:34:32

Jeśli nie masz nic przeciwko odrzuceniu niezniszczalnych znaków, możesz użyć -c flagi

iconv -c -t utf8 filename.csv > filename.utf8.csv

A następnie skopiuj je do swojej tabeli

 2
Author: Abdellah Alaoui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-03 12:03:47

W Pythonie musisz użyć

Klasa pg8000.typy.Bytea (str) Bytea jest klasą pochodną str, która jest mapowana do tablicy bajtów PostgreSQL.

LUB

Pg8000Binary (wartość) Zbuduj obiekt zawierający dane binarne.

 1
Author: vrn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-18 11:09:46
copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';

Możesz spróbować obsłużyć kodowanie UTF8.

 1
Author: Rishi jha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-04 07:00:38

Ten błąd może wystąpić, jeśli Dane wejściowe zawierają sam znak escape. Domyślnie znakiem escape jest symbol"\", więc jeśli tekst wejściowy zawiera znak " \ " - spróbuj zmienić wartość domyślną za pomocą opcji ESCAPE.

 0
Author: jaasco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-27 11:08:11

Jest również bardzo możliwe z tym błędem, że pole jest zaszyfrowane w miejscu. Upewnij się, że patrzysz na właściwą tabelę, w niektórych przypadkach administratorzy utworzą niezaszyfrowany widok, którego możesz użyć zamiast niego. Ostatnio napotkałem bardzo podobny problem.

 0
Author: Josh Barton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-08 20:38:40

Otrzymałem ten sam błąd, gdy próbowałem skopiować plik csv wygenerowany przez Excela do tabeli Postgres (wszystko na komputerze Mac). Tak to rozwiązałem:

1) Otwórz plik w atomie (IDE którego używam)

2) Dokonaj nieznacznej zmiany w pliku. Zapisz plik. Cofnij zmianę. Zapisz ponownie.

Presto! Polecenie kopiowania zadziałało.

(myślę, że Atom zapisał to w formacie, który zadziałał)

 0
Author: Anupam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-27 07:10:34

Otwórz plik CSV za pomocą Notepad++ . Wybierz menu Encoding \ Encoding in UTF-8, następnie napraw kilka komórek ręcznie.

Następnie spróbuj ponownie zaimportować.

 0
Author: Do Nhu Vy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-19 03:19:16