sequência de bytes inválida para codificação "UTF8"

124

Estou tentando importar alguns dados para o meu banco de dados. Então, eu criei uma tabela temporária,

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

E agora estou tentando importar os dados ,

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

Mas então eu recebo o erro,

ERROR:  invalid byte sequence for encoding "UTF8": 0xc92c

Como faço para corrigir isso? Preciso alterar a codificação do meu banco de dados inteiro (se sim, como?) Ou posso alterar apenas a codificação da minha tmptabela? Ou devo tentar alterar a codificação do arquivo?

mpen
fonte
altere a opção de codificação na importação. Eu configurei o meu para "Windows-1251" e funcionou sem reclamar.
Brian D
1
Obrigado @BrianD, eu também estava enfrentando esse problema e isso funcionou para mim.
precisa saber é o seguinte

Respostas:

109

Se você precisar armazenar dados UTF8 em seu banco de dados, precisará de um banco de dados que aceite UTF8. Você pode verificar a codificação do seu banco de dados no pgAdmin. Apenas clique com o botão direito do mouse no banco de dados e selecione "Propriedades".

Mas esse erro parece indicar que existem alguns dados UTF8 inválidos no seu arquivo de origem. Isso significa que o copyutilitário detectou ou adivinhou que você está alimentando um arquivo UTF8.

Se você estiver executando sob alguma variante do Unix, poderá verificar a codificação (mais ou menos) com o fileutilitário.

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(Acho que também funcionará em Macs no terminal.) Não tenho certeza de como fazer isso no Windows.

Se você usar esse mesmo utilitário em um arquivo proveniente de sistemas Windows (ou seja, um arquivo não codificado em UTF8), provavelmente mostrará algo assim:

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

Se as coisas ficarem estranhas, você pode tentar converter seus dados de entrada em uma codificação conhecida, alterar a codificação do cliente ou ambas. (Estamos realmente ampliando os limites do meu conhecimento sobre codificações.)

Você pode usar o iconvutilitário para alterar a codificação dos dados de entrada.

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

Você pode alterar a codificação psql (o cliente) seguindo as instruções no Suporte ao conjunto de caracteres . Nessa página, procure a frase "Para habilitar a conversão automática de conjunto de caracteres".

Mike Sherrill 'Recorde Gato'
fonte
3
Diz que o arquivo é ASCII, mas contém caracteres acentuados, portanto, isso deve estar errado?
MPEN
2
Aceitará esta resposta, mas acho que o problema estava realmente com os dados (Q atualizado).
Mf1
1
Achei isso útil, obrigado. A propósito, ele roda em terminais OS X também
Raul Rene
1
Isso funcionou para mim, mas de uma maneira um pouco diferente. O comando "iconv" realmente bombardeou meu arquivo, mas foi exatamente onde estava o problema - algum tipo estranho de personagem "-". De qualquer forma, removi isso e meu arquivo foi capaz de carregar no postgres. Obrigado pela dica!
Trip0d199
1
Apenas para ajudar outras pessoas e os mecanismos de pesquisa: isso funciona para converter uma exportação Stripe CSV com caracteres ilegíveis de volta para UTF-8: `iconv -f ISO-8859-15 -t utf-8 customers.csv> customers-utf8.csv`
Sscarduzio
57
psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';

Adicionando encodingopção funcionou no meu caso.

Nobu
fonte
1
será concluído sem erro, pode ou não fornecer resultados úteis. você precisa conhecer a codificação pretendida dos dados.
Jasen
1
No meu cenário, como a consulta acima funcionou? Eu tenho arquivo csv codificado com UTF8 e DB codificado com UTF8.
Ajay Takur
14

Aparentemente, eu posso definir a codificação rapidamente,

 set client_encoding to 'latin1'

E, em seguida, execute novamente a consulta. Não tenho certeza qual codificação devo usar.


latin1tornou os caracteres legíveis, mas a maioria dos caracteres acentuados estava em maiúsculas, onde não deveriam estar. Supus que isso se devesse a uma codificação incorreta, mas acho que os dados eram realmente ruins. Acabei mantendo a codificação latin1, mas pré-processando os dados e corrigindo os problemas de revestimento.

mpen
fonte
Curiosamente, recebi o erro em uma instrução SELECT! Isso resolveu porque era meu cliente psql dando o erro, não o próprio banco de dados. (O que teria rejeitado os dados em primeiro lugar, se a codificação não fosse permitida.) #
Wildcard
14

Se você concorda com o descarte de caracteres não conversíveis, pode usar o -csinalizador

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

e copie-os para sua mesa

Abdellah Alaoui
fonte
No Mac, era iconv -c -t UTF-8 filename.csv > filename.utf8.csvpara mim #
Michael Michael
8

Esse erro significa que a codificação dos registros no arquivo é diferente em relação à conexão. Nesse caso, iconv pode retornar o erro, algumas vezes, apesar do sinalizador // IGNORE:

iconv -f ASCII -t utf-8 // IGNORE <b.txt> /a.txt

iconv: sequência de entrada ilegal na posição (algum número)

O truque é encontrar caracteres incorretos e substituí-lo. Para fazer isso no Linux, use o editor "vim":

vim (seu arquivo de texto), pressione "ESC": botão e digite ": goto (número retornado por iconv)"

Para encontrar caracteres não ASCII, você pode usar o seguinte comando:

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

Se você remover caracteres incorretos, verifique se realmente precisa converter seu arquivo: provavelmente o problema já está resolvido.

Yuri Levinsky
fonte
iconv -c -f utf8 -t utf8//IGNORE < dirty.txt > clean.txt
Jasen
5

siga as etapas abaixo para resolver esse problema no pgadmin:

  1. SET client_encoding = 'ISO_8859_5';

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

Ramesh R
fonte
4

Depende de que tipo de máquina / codificação gerou seu arquivo de importação.

Se você o obtiver de uma versão em inglês ou na Europa Ocidental do Windows, sua melhor aposta provavelmente será defini-la como 'WIN1252'. Se você o obtiver de uma fonte diferente, consulte a lista de codificações de caracteres aqui:

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

Se você o obtiver em um Mac, talvez seja necessário executá-lo através do utilitário "iconv" primeiro para convertê-lo de MacRoman para UTF-8.

BobG
fonte
4

Bem, eu estava enfrentando o mesmo problema. E o que resolveu meu problema é este:

No excel, clique em Salvar como. Em Salvar como tipo, escolha .csv Clique em Ferramentas . Em seguida, escolha opções da web na lista suspensa. Na guia Codificação , salve o documento como Unicode (UTF-8) . Clique OK. Salve o arquivo. FEITO !

Vishal Chhatwani
fonte
3

Eu tive o mesmo problema e encontrei uma boa solução aqui: http://blog.e-shell.org/134

Isso é causado por uma incompatibilidade nas codificações do banco de dados, certamente porque o banco de dados de onde você obteve o dump SQL foi codificado como SQL_ASCII enquanto o novo codificado como UTF8. .. Recode é uma pequena ferramenta do projeto GNU que permite alterar rapidamente a codificação de um determinado arquivo.

Então, apenas recodifiquei o arquivo de despejo antes de reproduzi-lo:

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

Nos sistemas Debian ou Ubuntu, a recodificação pode ser instalada via pacote.

Ed Doerr
fonte
2

Você pode substituir o caractere de barra invertida por, por exemplo, um caractere de pipe, por sed.

sed -i -- 's/\\/|/g' filename.txt
Richard Greenwood
fonte
2
copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';

você pode tentar fazer isso para lidar com a codificação UTF8.

Rishi jha
fonte
2

Exemplo curto para resolver este problema em PHP

$val = "E'\377'";
iconv(mb_detect_encoding($val, mb_detect_order(), true), "UTF-8", $val);

Detalhe do erro: Como o banco de dados POSTGRES não manipula outros caracteres que não UTF-8, quando tentamos passar as entradas acima fornecidas para uma coluna, ocorre um erro de "sequência de bytes inválida para codificar" UTF8 ": 0xab".

Portanto, basta converter esse valor em UTF-8 antes da inserção no banco de dados POSTGRES.

Nneha Sachan
fonte
2

Eu tive o mesmo problema: meu arquivo não foi codificado como UTF-8. Eu o resolvi abrindo o arquivo com o bloco de notas ++ e alterando a codificação do arquivo.

Vá para "Codificação" e selecione "Converter em UTF-8". Salve as alterações e pronto!

Francisco Javier Snchez Sabido
fonte
1

Este erro pode ocorrer se os dados de entrada contiverem o próprio caractere de escape. Por padrão, o caractere de escape é o símbolo "\"; portanto, se o texto de entrada contiver "\" - tente alterar o valor padrão usando a opção ESCAPE.

jaasco
fonte
1

Para python, você precisa usar

A classe pg8000.types.Bytea (str) Bytea é uma classe derivada de str que é mapeada para uma matriz de bytes do PostgreSQL.

ou

Pg8000.Binary (valor) Construa um objeto que contém dados binários.

vrn
fonte
1

Eu me deparei com esse problema no Windows enquanto trabalhava exclusivamente com o psql (sem ferramentas gráficas). Para corrigir esse problema, altere permanentemente a codificação padrão do psql (cliente) para corresponder à codificação padrão do servidor PostgreSQL. Execute o seguinte comando no CMD ou no PowerShell:

setx PGCLIENTENCODING UTF8

Feche e reabra o prompt de comando / Powershell para que a alteração entre em vigor.

Altere a codificação do arquivo de backup de Unicode para UTF8, abrindo-o com o Bloco de notas e indo em Arquivo -> Salvar como. Altere o menu suspenso Codificação de Unicode para UTF8. (Altere também o tipo Salvar como de Documentos de texto (.txt) para Todos os arquivos para evitar adicionar a extensão .txt ao nome do arquivo de backup). Agora você deve conseguir restaurar seu backup.

Ele Ele
fonte
0

Também é muito possível com esse erro que o campo seja criptografado no local. Verifique se você está olhando a tabela correta; em alguns casos, os administradores criarão uma exibição não criptografada que você poderá usar. Encontrei recentemente um problema muito semelhante.

Josh Barton
fonte
0

Eu recebi o mesmo erro ao tentar copiar um csv gerado pelo Excel para uma tabela do Postgres (tudo em um Mac). Foi assim que eu resolvi:

1) Abra o arquivo no Atom (o IDE que eu uso)

2) Faça uma alteração insignificante no arquivo. Salve o arquivo. Desfazer a alteração. Salve novamente.

Presto! O comando de cópia funcionou agora.

(Acho que o Atom o salvou em um formato que funcionou)

Anupam
fonte
0

Abra o arquivo CSV pelo Notepad ++. Escolha menu Encoding\ Encoding in UTF-8e corrija algumas células manualmente.

Em seguida, tente importar novamente.

Do Nhu Vy
fonte
0

Se o seu CSV for exportado do SQL Server, é enorme e possui caracteres Unicode, você pode exportá-lo definindo a codificação como UTF-8:

Right-Click DB > Tasks > Export > 'SQL Server Native Client 11.0' >> 'Flat File Destination > File name: ... > Code page: UTF-8 >> ...

Na próxima página, ele pergunta se você deseja copiar dados de uma tabela ou se deseja escrever uma consulta. Se você possui charou varchartipos de dados em sua tabela, selecione a opção de consulta e projete essas colunas como nvarchar(max). Por exemplo, se myTabletiver duas colunas onde a primeira é varchare a segunda int, eu lancei a primeira para nvarchar:

select cast (col1 as nvarchar(max)) col1
       , col2
from myTable
LoMaPh
fonte