Upload
sebastian-webber
View
485
Download
0
Embed Size (px)
Citation preview
Fique ninja na codificação de
caracteres…Ou muito do que você devia saber sobre encoding e tinha
vergonha de perguntar
Sebastian Webber
Sebastian Webber
Consultor na area de TI com expertise em PostgreSQL, JBoss e AWS Instrutor de banco de dados Já desistiu da faculdade umas 3 vezes… Gosta muito de cozinhar Ninja desde 2015
Afinal o que é encoding?
Uma codificação de caracteres é um padrão de relacionamento entre um conjunto de caracteres com um conjunto de outra coisa, como por exemplo números ou pulsos elétricos com o objetivo de facilitar o armazenamento de texto em computadores...
…Ou uma forma de representar letras, números ou simbulos através de numeros ou outros artificios.
Exemplos
Código Morse Tabela ASCII
No começo…
Letras e simbolos eram salvos em 7 BITS e isso permitia que todo o alfabeto e simbolos comuns fossem representados através de códigos númericos… Estava tudo certo pra quem falava inglês.
Aí o resto do mundo passou a comprar IBM PC fora da américa e pra cada região, caracteres diferentes da lingua inglesa eram tratadas no 8º BIT
Code Pages foram criados para definir o escopo de cada lingua. Na pratica todo e qualquer abaixo de 127 era igual, mas as diferenças eram tradadas acima dele.
Linguas asiaticas precisaram mais de 1 byte para a representação de seus ideogramas ou simbolos especificos
Codificações ou Code Pages
A ISO padronizou code pages de acordo com a região e lingua mas a danada da Microsoft criou a sua versão dos encodings para o ambiente Windows.
Isso quer dizer que encondings como LATIN1 (ISO 8859-1) e LATIN-9(ISO 8859-15) são equivalentes ao WIN1251.
Universal Character Set
A fim de acabar com essa confusão e multiplos padrões foi criado o Unicode
Ele é representado por 3 encodings: UTF-8 UTF-16 UTF-32
Problemas comuns de encoding
Email, é claro! Páginas da WEB que não utilizam UTF-8 A sua aplicação!
Como resolver?
Utilize UTF-8! Se utf-8 ainda não tiver
os caracteres necessários pra sua aplicação, avalie o UTF-16 ou UTF-32
http://utf8everywhere.org
Por que devo migrar pra UTF-8?
Por que usar um encoding universal é muito mais fácil Por que é um jeito fácil de não esquentar mais a cabeça com
encoding Por que você já usa e não sabe (seu SO deve estar usando). E por que você não quer mais erros como esse na sua aplicação:
E quanto ao
Quais encodings o PostgreSQL supporta? BIG5 EUC_CN EUC_JP EUC_JIS_2004 EUC_KR EUC_TW GB18030 GBK ISO_8859_5 ISO_8859_6
ISO_8859_7 ISO_8859_8 JOHAB KOI8R KOI8U LATIN1 LATIN2 LATIN3 LATIN4 LATIN5
LATIN6 LATIN7 LATIN8 LATIN9 LATIN10 MULE_INTERNAL SJIS SHIFT_JIS_2004 SQL_ASCII UHC UTF8
WIN866 WIN874 WIN1250 WIN1251 WIN1252 WIN1253 WIN1254 WIN1255 WIN1256 WIN1257 WIN1258
Aonde eu configuro o encoding?
Pra definir o default, é necessário fazer isso via initdb
Na criação da database. Seja no createdb:
..Ou no CREATE DATABASE:
initdb -E EUC_JP
createdb -E EUC_KR -T template0 korean_db
CREATE DATABASE korean_db WITH ENCODING 'EUC_KR' TEMPLATE=template0;
NÃO É POSSIVEL TROCAR O ENCODING
DEPOIS DE CRIAR O BANCO!
Locale
O Suporte ao locale respeita as preferencias culturais como alfabetos, ordenação, formatação numerica, etc.
O PostgreSQL usa o padrão ISO C e POSIX do sistema operacional O suporte a locales é automaticamente na inicialização do cluster
(criado apartir do initdb)
Locale
As configurações de locale influenciam nos seguintes recursos SQL: Ordem de ordenação de caracteres utilizando a clausula ORDER BY ou a
comparação de operações em campos do tipo texto (text, varchar, etc). Nas funções UPPER, LOWER e INITCAP Operadores de comparação de padrões (LIKE, SIMILAR TO e expressões
regulares POSIX) As funções to_char A possibilidade de utilizar indexes com o operador LIKE
Locale
Ocasionalmente é util combinar varios locales, por exemplo, utilizar regras de collate em inglês (en_US) e exibir mensagens em espanhol (es_AR).
Para permitir esse tipo de combinação de vários locales, as variaveis abaixo permitem a configuração específica:
LC_COLLATE Ordenação de caracteres
LC_CTYPE Classificação de caracteres (o que é uma letra? É equivalente a uma letra maiuscula?)
LC_MESSAGES Linguagem para exibir as mesas do servidorLC_MONETARY Exibição de moedasLC_NUMERIC Exibição de númerosLC_TIME Exibição de datas e horários
Collation
Permite especificar o locale de ordenação (LC_COLLATE) e classificações de caracteres (LC_CTYPE) a nível de colunas ou por operação.
Isso facilita a sua vida por permite que você utilizar um locale diferente do criado no banco de dados.
CREATE TABLE test1 (
a text COLLATE "de_DE",
b text COLLATE "es_ES",
...
);
SELECT a < (’foo’ COLLATE ‘fr_FR’) FROM test1;
SELECT * FROM test1 ORDER BY a || b COLLATE "fr_FR";
Como eu TROCO de um encoding pra outro? pg_dump e pg_restore Replicação lógica (casando o encoding de origem com de destino)
Düv¡dç?
Referências
http://local.joelonsoftware.com/wiki/O_M%C3%ADnimo_Absoluto_Que_Todo_Desenvolvedor_De_Software_Absolutamente,_Positivamente_Precisa_Saber_Sobre_Unicode_E_Conjuntos_de_Caracteres_(Sem_Desculpas!)
http://www.i18nguy.com/unicode/codepages.html#msftdos http://www.i18nqa.com/debug/table-iso8859-1-vs-windows-1252.html https://annevankesteren.nl/2009/09/utf-8-reasons http://htmlpurifier.org/docs/enduser-utf8.html http://www.postgresql.org/docs/current/static/multibyte.html