AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 345691
Accepted
claytond
claytond
Asked: 2025-03-13 02:42:48 +0800 CST2025-03-13 02:42:48 +0800 CST 2025-03-13 02:42:48 +0800 CST

ERRO: sequência de bytes inválida para codificação "UTF8": 0xdc 0x36

  • 772

Ao executar um arquivo \copy(pgadmin ou aws_s3.table_import_from_s3) de 1,6 GB em um banco de dados compatível com o AWS Aurora Postgres, recebo o seguinte erro:

ERROR:  invalid byte sequence for encoding "UTF8": 0xdc 0x36
CONTEXT:  COPY staging, line 99779: "L24000403170365 ACTIVEZONE LLC                                                                      ..."

EDIT: Aqui está o que eu consegui extrair para a definição da tabela (mas me avise se quiser mais):

nome_da_coluna tipo_de_dados comprimento_máximo_de_caractere é_anulável coluna_padrão
cru texto [nulo] SIM [nulo]

EDIT: Também tentei alterar a coluna, mas byteanão obtive efeito.

A fonte deveria ser ASCII, mas recebo o mesmo erro com codificações explícitas como utf8, latin1, win1251, e win1252. EDIT: Conforme solicitado em uma resposta, aqui estão mais informações sobre os comandos de importação. No pgadmin4, estou importando com o botão direito do mouse na tabela que mostra o seguinte sob as capas:

--command " "\\copy public.staging (\"raw\") FROM 'C:/data.txt' DELIMITER '|' ENCODING 'UTF8';""

Eu também uso o pgadmin4 para acionar a importação da tabela s3 chamando a consulta:

SELECT aws_s3.table_import_from_s3(
   'staging',
   '', 
   '(DELIMITER ''|'')',
   aws_commons.create_s3_uri('data', 'data.txt', 'us-east-1')
);

Debaixo das cobertas, table_import_from_s3chama o comando:

copy staging from '/rdsdbdata/extensions/aws_s3/{{internal filename}}' with (DELIMITER '|')

A resposta para perguntas semelhantes é limpar os dados de origem, então eu abri o python e tentei encontrar o caractere ofensivo. Não consegui encontrar nenhuma evidência de um caractere incomum na linha referenciada ou ao redor dela. Para fins de argumentação, acredito que o seguinte escaneará o arquivo inteiro (e você pode ver os resultados em linha):

>>> def charinfile(filename, bytechar):
...     with open(filename, 'rb') as file:
...         byteline = file.readline()
...         while byteline:  # readline returns empty string at EOF
...             if byteline.find(bytechar) != -1:
...                 print("found!")
...                 return byteline
...             byteline = file.readline()
...         else:
...             print("not found")
...
>>> charinfile(filename, b'\xdc')
not found
>>> charinfile(filename, b'\xdc36')
not found
>>> charinfile(filename, b'6') # make sure the code is working
found!

Também tentei versões em que uso strings em vez de bytes com os mesmos resultados. Posso confirmar que não há linhas em branco antes do EOF (usei contadores de linha para verificar se cheguei a ~1m de linhas).

O que estou perdendo?

postgresql
  • 3 3 respostas
  • 72 Views

3 respostas

  • Voted
  1. claytond
    2025-03-17T02:56:17+08:002025-03-17T02:56:17+08:00

    O código sugerido por @laurenz-albe funcionou, mas também funcionou com UFT8então o ENCODINGnão era realmente o problema. Após alguns testes, mudar de FORMAT 'text'para FORMAT 'csv'foi a mudança crítica. Continuei a usar os pontos de código recomendados (eles parecem uma prática recomendada para evitar colisão de caracteres), resultando em uma consulta como:

    SELECT aws_s3.table_import_from_s3(
       'staging',
       '', 
       '(FORMAT ''csv'', DELIMITER E''\u0007'', QUOTE E''\u0004'')',
       aws_commons.create_s3_uri('data', 'data.txt', 'us-east-1')
    );
    

    ... ou em psql,

    \copy public.staging FROM 'C:\\data.txt' (FORMAT 'csv', DELIMITER E'\u0007', QUOTE E'\u0004')
    
    • 1
  2. Best Answer
    Daniel Vérité
    2025-03-25T01:13:32+08:002025-03-25T01:13:32+08:00

    Ao usar o TEXTformato de cópia, o caractere de barra invertida tem um significado especial . A linha no seu arquivo que produz a falha contém uma sequência como esta:

    FL\33463
    

    \334é interpretado como um número octal devido à seguinte regra:

    \digits Barra invertida seguida de um a três dígitos octais especifica o byte

    334em octal = 0xdcem hexadecimal, e 6em ASCII = 0x36em hexadecimal, e isso faz com 0xdc 0x36que o decodificador UTF8 reclame.

    A solução de princípio para esse problema é citar todas as barras invertidas no arquivo de entrada, duplicando-as . Como alternativa, você pode usar CSV com aspas e delimitadores que não existem no arquivo, como você fez, mas isso é perigoso se os dados não estiverem limpos.

    • 1
  3. Laurenz Albe
    2025-03-14T15:37:02+08:002025-03-14T15:37:02+08:00

    Seus dados devem ter alguma codificação diferente. Conecte-se ao banco de dados com psqle tente

    \copy public.staging FROM 'C:\\data.txt' (FORMAT 'csv', DELIMITER E'\u0007', QUOTE E'\u0004', ENCODING 'WIN1252')
    

    Isso pressupõe que os caracteres ASCII com os pontos de código 4 e 7 não ocorrem em nenhum lugar do seu arquivo.

    • 0

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve