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 / 266763
Accepted
Lennart - Slava Ukraini
Lennart - Slava Ukraini
Asked: 2020-05-09 04:59:53 +0800 CST2020-05-09 04:59:53 +0800 CST 2020-05-09 04:59:53 +0800 CST

clp acrescenta bytes à saída

  • 772

Estou migrando vários bancos de dados para UTF-8 e acabei de descobrir fenômenos que não conhecia. Ao selecionar dados para o terminal, bytes adicionais são adicionados à saída. Exemplo:

~]$ x=$(db2 -x "values 'a'")
~]$ echo "${x}b"
a b

Um espaço adicional após um

~]$ x=$(db2 -x "values 'aa'")
echo "${x}b"
aa  b

Dois espaços adicionais após aa

Não parece importar quantos bytes um caractere ocupa em utf8:

~]$ x=$(db2 -x "values '?'")
~]$ echo "${x}b"
? b

Um espaço adicional após g-clave

~]$ x=$(db2 -x "values '??'")
~]$ echo "${x}b"
??  b

Dois espaços adicionais após a clave de sol

db cfg:

Database territory                                      = SE
Database code page                                      = 1208
Database code set                                       = UTF8
Database country/region code                            = 46
Database collating sequence                             = SYSTEM_819_SE

O terminal tem codificação UTF8 (tentei terminador e gnome-terminal), e antes de conectar ao banco de dados eu fiz:

export LC_CTYPE=sv_SE.utf8

O acima é, obviamente, apenas exemplos bobos, mas eu tenho uma boa quantidade de testes em scripts semelhantes a esse:

dbtype=`db2 -x "values nya.get_db_type()"`
if [ "${dbtype}" = "N" ]; then
    ...

onde eu preciso mudar o teste de uma forma ou de outra.

Alguma ideia sobre uma configuração que eliminaria os bytes extras?

~]$ uname -a
Linux nya-ladok3-release 3.10.0-1062.9.1.el7.x86_64 #1 SMP Mon Dec 2 08:31:54 EST 2019 x86_64 x86_64 x86_64 GNU/Linux
~]$ db2level
DB21085I  This instance or install (instance name, where applicable: 
"db2inst1") uses "64" bits and DB2 code release "SQL11050" with level 
identifier "0601010F".
Informational tokens are "DB2 v11.5.0.0", "s1906101300", "DYN1906101300AMD64", 
and Fix Pack "0".
Product is installed at "/opt/ibm/db2/V11.5".
db2 db2-luw
  • 1 1 respostas
  • 68 Views

1 respostas

  • Voted
  1. Best Answer
    Lennart - Slava Ukraini
    2020-05-09T06:13:43+08:002020-05-09T06:13:43+08:00

    Esta é a explicação que recebi do suporte da IBM, não testei eu mesmo, mas parece razoável. A solução alternativa sugerida funcionará para todas as situações em que posso pensar agora:

    Os espaços extras preenchidos no CLP são o comportamento esperado. Isso ocorre porque existem alguns caracteres de vários bytes que ocupam mais de 1 espaço físico. Veja abaixo exemplo que demonstra o mesmo:

    Diga, U+FF2D LETRAS MAIÚSCULAS EM LATIM M

    $ db2 "select a, hex(a) from table(values('A' || u&'\FF2D' || 'B'),('A B')) t(a)"
    A   2     
    ----- ----------
    AMB 41EFBCAD42 —> Here wide-M is taking more space than a normal multi/single byte character. 
    A B  41204220202 record(s) selected.
    

    Se você estiver usando muitas funções como get_db_type() em seus scripts, poderá alterar o valor de retorno dessas funções para modificá-lo para OCTETS:

    Algo como o seguinte:

    CREATE OR REPLACE FUNCTION get_db_type()
    RETURNS VARCHAR(1 OCTETS)
    DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
    BEGIN ATOMIC
        RETURN 'N';
    
    END @
    

    Vou deixar a solução atual como está abaixo:

    Se nada mais aparecer, provavelmente farei algo como:

    x=$(db2 -x "values ('??')")
    x="${x%"${x##*[![:space:]]}"}"
    echo ${x}b
    ??b
    

    A princípio, imaginei:

    x=$(db2 -x "values ('??')" | xargs echo)
    

    faria, mas o pipe introduz um subshell, então:

    echo ${x}b
    SQL1024N A database connection does not exist. SQLSTATE=08003b
    

    não funciona.

    • 0

relate perguntas

  • Migração de DB2 para MySQL

  • O que significa TBSCAN GENROW no Plano Explicativo?

  • Emule o comportamento do REGEXP no DB2 SQL

  • BLOB no DB2 v9 no z/OS

  • O que significa HSJOIN em um plano de explicação?

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