Ja próbuje zaimportować dane do mojej bazy danych. Więc utworzyłem tymczasową tabelę,
create temporary table tmp(pc varchar(10), lat decimal(18,12), lon decimal(18,12), city varchar(100), prov varchar(2));
Teraz próbuję zaimportować dane ,
copy tmp from '/home/mark/Desktop/Canada.csv' delimiter ',' csv
Ale potem pojawia się błąd,
ERROR: invalid byte sequence for encoding "UTF8": 0xc92c
Jak to naprawić? Czy muszę zmienić kodowanie całej mojej bazy danych (jeśli tak, w jaki sposób?), Czy mogę zmienić tylko kodowanie mojej tmp
tabeli? Czy powinienem spróbować zmienić kodowanie pliku?
postgresql
import
mpen
źródło
źródło
Odpowiedzi:
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. Kliknij bazę danych prawym przyciskiem myszy i wybierz „Właściwości”.
Ale ten błąd wydaje się informować, że w pliku źródłowym są nieprawidłowe dane UTF8. Oznacza to, że
copy
narzędzie wykryło lub zgadło, że podajesz mu plik UTF8.Jeśli pracujesz pod jakimś wariantem Uniksa, możesz sprawdzić kodowanie (mniej więcej) za pomocą
file
narzędzia.(Myślę, że to zadziała również na komputerach Mac w terminalu.) Nie wiem, jak to zrobić w systemie Windows.
Jeśli użyjesz tego samego narzędzia do pliku pochodzącego z systemu Windows (czyli pliku, który nie jest zakodowany w UTF8), prawdopodobnie pokaże coś takiego:
Jeśli sprawy pozostaną dziwne, możesz spróbować przekonwertować dane wejściowe na znane kodowanie, zmienić kodowanie klienta lub jedno i drugie. (Naprawdę przekraczamy granice mojej wiedzy na temat kodowania).
Możesz użyć
iconv
narzędzia do zmiany kodowania danych wejściowych.Możesz zmienić kodowanie psql (klienta), postępując zgodnie z instrukcjami dotyczącymi obsługi zestawu znaków . Na tej stronie wyszukaj frazę „Aby włączyć automatyczną konwersję zestawu znaków”.
źródło
Dodanie
encoding
opcji zadziałało w moim przypadku.źródło
Najwyraźniej mogę po prostu ustawić kodowanie w locie,
Następnie ponownie uruchom zapytanie. Nie wiem jednak, jakiego kodowania powinienem używać.
latin1
sprawiło, że znaki były czytelne, ale większość znaków akcentowanych była pisana dużymi literami tam, gdzie nie powinny. Zakładałem, że jest to spowodowane złym kodowaniem, ale myślę, że w rzeczywistości dane były po prostu złe. Ostatecznie zachowałem kodowanie latin1, ale wstępnie przetworzyłem dane i rozwiązałem problemy z obudową.źródło
Jeśli nie masz nic przeciwko odrzucaniu znaków, których nie można zamienić, możesz użyć
-c
flagia następnie skopiuj je do swojego stołu
źródło
iconv -c -t UTF-8 filename.csv > filename.utf8.csv
dla mnieTen błąd oznacza, że kodowanie rekordów w pliku różni się w zależności od połączenia. W tym przypadku iconv może zwrócić błąd, czasami nawet pomimo flagi // IGNORE:
iconv -f ASCII -t utf-8 // IGNORUJ <b.txt> /a.txt
iconv: niedozwolona sekwencja wprowadzania na pozycji (pewna liczba)
Sztuczka polega na znalezieniu nieprawidłowych 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ć plik: prawdopodobnie problem został już rozwiązany.
źródło
iconv -c -f utf8 -t utf8//IGNORE < dirty.txt > clean.txt
wykonaj poniższe kroki, aby rozwiązać ten problem w pgadmin:
SET client_encoding = 'ISO_8859_5';
COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;
źródło
To zależy od typu maszyny / kodowania, które wygenerowało plik importu.
Jeśli otrzymujesz go z angielskiej lub zachodnioeuropejskiej wersji systemu Windows, najlepszym rozwiązaniem jest prawdopodobnie ustawienie „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 pobierasz go z komputera Mac, być może będziesz musiał najpierw uruchomić go przez narzędzie „iconv”, aby przekonwertować go z MacRoman na UTF-8.
źródło
Cóż, miałem ten sam problem. A to, co rozwiązało mój problem, to:
W programie Excel kliknij Zapisz jako. Z Zapisz jako typ wybierz .csv Kliknij Narzędzia . Następnie wybierz opcje internetowe z rozwijanej listy. Na karcie Kodowanie zapisz dokument w formacie Unicode (UTF-8) . Kliknij OK. Zapisz plik. GOTOWE !
źródło
Miałem ten sam problem i znalazłem fajne rozwiązanie tutaj: http://blog.e-shell.org/134
Więc po prostu przekodowałem plik zrzutu przed odtworzeniem go:
W systemach Debian lub Ubuntu recode można zainstalować za pośrednictwem pakietu.
źródło
Znak ukośnika odwrotnego można zastąpić, na przykład pionową kreską, sedem.
źródło
możesz spróbować obsługiwać kodowanie UTF8.
źródło
Krótki przykład rozwiązania tego problemu w PHP-
Szczegóły błędu: Ponieważ baza danych POSTGRES nie obsługuje znaków innych niż UTF-8, kiedy próbujemy przekazać powyższe dane wejściowe do kolumny, daje to błąd „nieprawidłowa sekwencja bajtów do kodowania„ UTF8 ”: 0xab”.
Więc po prostu przekonwertuj tę wartość na UTF-8 przed wstawieniem do bazy danych POSTGRES.
źródło
Miałem ten sam problem: mój plik nie został zakodowany jako UTF-8. Rozwiązałem to, otwierając plik za pomocą notatnika ++ i zmieniając kodowanie pliku.
Przejdź do „Kodowania” i wybierz „Konwertuj na UTF-8”. Zapisz zmiany i to wszystko!
źródło
Ten błąd może wystąpić, jeśli dane wejściowe zawierają same znaki zmiany znaczenia. Domyślnym znakiem zmiany znaczenia jest symbol „\”, więc jeśli wprowadzany tekst zawiera znak „\” - spróbuj zmienić wartość domyślną za pomocą opcji ESCAPE.
źródło
W przypadku Pythona musisz użyć
Klasa pg8000.types.Bytea (str) Bytea jest klasą pochodną typu str, która jest odwzorowywana na tablicę bajtów PostgreSQL.
lub
Pg8000.Binary (wartość) Skonstruuj obiekt przechowujący dane binarne.
źródło
Napotkałem ten problem pod Windows podczas pracy wyłącznie z psql (bez narzędzi graficznych). Aby rozwiązać ten problem, na stałe zmień domyślne kodowanie psql (klient), aby pasowało do domyślnego kodowania serwera PostgreSQL. Uruchom następujące polecenie w CMD lub Powershell:
Zamknij i ponownie otwórz wiersz polecenia / PowerShell, aby zmiana zaczęła obowiązywać.
Zmień kodowanie pliku kopii zapasowej z Unicode na UTF8, otwierając go w Notatniku i przechodząc do Plik -> Zapisz jako. Zmień listę rozwijaną Kodowanie z Unicode na UTF8. (Zmień także Zapisz jako typ z Dokumenty tekstowe (.txt) na Wszystkie pliki, aby uniknąć dodawania rozszerzenia .txt do nazwy pliku kopii zapasowej). Teraz powinno być możliwe przywrócenie kopii zapasowej.
źródło
Jest również bardzo możliwe z tym błędem, że pole jest zaszyfrowane na miejscu. Upewnij się, że patrzysz na odpowiednią tabelę, w niektórych przypadkach administratorzy utworzą niezaszyfrowany widok, którego możesz użyć zamiast tego. Niedawno spotkałem się z bardzo podobnym problemem.
źródło
Otrzymałem ten sam błąd, gdy próbowałem skopiować plik csv wygenerowany przez program Excel do tabeli Postgres (wszystko na komputerze Mac). Oto jak to rozwiązałem:
1) Otwórz plik w Atom (IDE, którego używam)
2) Wprowadź nieznaczną zmianę w pliku. Zapisz plik. Cofnij zmianę. Zapisz ponownie.
Presto! Polecenie kopiowania działało teraz.
(Myślę, że Atom zapisał go w formacie, który działał)
źródło
Otwórz plik CSV przez Notepad ++. Wybierz menu
Encoding
\Encoding in UTF-8
, a następnie napraw ręcznie kilka komórek.Następnie spróbuj ponownie zaimportować.
źródło
Jeśli twój plik CSV ma zostać wyeksportowany z SQL Server, jest ogromny i zawiera znaki Unicode, możesz go wyeksportować, ustawiając kodowanie jako
UTF-8
:Right-Click DB > Tasks > Export > 'SQL Server Native Client 11.0' >> 'Flat File Destination > File name: ... > Code page: UTF-8 >> ...
Na następnej stronie zapyta, czy chcesz skopiować dane z tabeli, czy chcesz napisać zapytanie. Jeśli masz
char
lubvarchar
typy danych w tabeli, wybierz opcję zapytania i rzutuj te kolumny jakonvarchar(max)
. Np. JeślimyTable
ma dwie kolumny, gdzie pierwsza jest,varchar
a drugaint
, rzutuję pierwszą nanvarchar
:źródło