Tipos de dados do MySQL 5

3.152 visualizações

Publicada em

Apostila com artigo extraído do site Imasters com os tipos de dados do banco MySQL

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
3.152
No SlideShare
0
A partir de incorporações
0
Número de incorporações
1
Ações
Compartilhamentos
0
Downloads
50
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Tipos de dados do MySQL 5

  1. 1. Tipos de Dados doMySQL 5.0Por Wagner BianchiNeste série de artigos, abordaremos todos os tipos de dados suportadospelo MySQL 5.0, além de ressaltar todos os problemas decorrentes de“inserções erradas” – estas que levam a perda de dados importantes no fluxogeral de uma aplicação.Saber o que é um tipo de dado e suas propriedades é essencial para que setenha máximo proveito da informação a ser armazenada no banco de dados,saber como definir os tipos em colunas de tabelas de sue banco de dados éalgo que decidirá o futuro de sucesso ou insucesso de sua aplicação. Assuntose dicas serão dadas no decorrer das explicações e todos os estudos aquiapresentados foram desenvolvidos a partir da matéria que é cobrada na examede certificação do MySQL 5.0 CMDEV I (Certified MySQL Developer I).swApós ler esta primeira parte do estudo, você estará apto à: Definir o que são tipos de dados e sua importância no armazenamento da informação; Quais são os tipos de dados suportados pelo MySQL 5.0; Trabalhar com todos os tipos de dados numéricos, além de também entender e trabalhar com suas propriedades; Quantificar quanto espaço necessita cada valor de um determinado tipos de dados; Idetificar “inserções erradas” – defendida por alguns autores como “inserções anômalas”;Tipos de dados são artifícios comuns em bancos de dados relacionais paratipificar conjuntos de possíveis valores definidos em uma coluna. Desde omomento em que você define que uma determinada coluna de uma tabelaarmazenará valores de um determinado tipo de dado, as características destesvalores que ocuparão aquela parte da tupla foram definidas. Os tipospermitidos para atributos de tabelas sempre sofrem inovações com o passar dotempo e desde o System R, da IBM, estes pequenos coadjuvantes ou artifíciossão bastante úteis para definição da forma como a informação deverá serarmazenada, melhor acessada e aproveitada, sem que haja perda einformações indesejadas não sejam permitidas.Para que os dados estejam realmente seguros, devemos prestar bastanteatenção ao definir o tipo de dados de colunas em tabelas em bancos de dados
  2. 2. de um projeto. É muito importante entender cada tipo de dado e suasconseqüências diante de várias das situações que seu banco de dados poderáser exposto no dia-a-dia.Começaremos então, com este artigo, um estudo sobre os tipos de dadossuportados pelo MySQL 5.0 assim como os principais fatores que podem tornara vida complicada desde a criação do banco de dados até o momento em quesomos, nós DBA`s, expostos à situações chatas como alterações indesejadase inesperadas nas informações contidas no banco de dados, em certosmomentos até irreparáveis. Não é de hoje que se fala que ter um backup válidoé preciso, mas sem entender os tipos de dados e todas as implicações queeles têm, talvez nem seja preciso ter um backup válido, pois, mesmo este nãoterá muito valor. Saber gerenciar um banco de dados quanto aos conjuntos decaracteres, espaço em disco e otimização em relação ao retorno da informaçãoé parte do conjunto de assuntos que abordaremos neste estudo.Este foi produzido em um ambiente simples, rodando o MySQL 5.0.45-nt-log sobre oWindows XP Professional. Utilizamos alguns exemplos como MySQL Query Browser e outros exemplos com o mysql client, este que já éfornecido na instalação padrão doMySQL 5.0.Sempre que iniciamos a definição de um modelo de dados lógico, já temos queter conhecimento dos tipos de dados para definirmos as colunas das tabelas,mas não é somente para definir as colunas, temos que ter conhecimento emrelação à fatores como rapidez na recuperação da informação e espaçorequerido para o armazenamento. Além disso, algumas colunas ainda terãoíndices, o que poderá diminuir o tempo de respostas ou mesmo degradar odesempenho de uma consulta. NoMySQL 5.0, como na maioria dos bancos dedados, temos um problema grave que divide muitos profissionais, a questão emtorno de tipos de dados CHAR e VARCHAR, que tem tipos de armazenamentomuito similares mas com grandes implicações no que se refere ao espaçorequerido em disco e performance para recuperação de informação. Fatoresque analisaremos assim que começarmos a discutir tipos de dados string.Temos que ter ciência e muito cuidado para definir tipos de dados decolunasAUTO_INCREMENT. A análise do negócio da aplicação que utilizará obanco de dados e suas tabelas para armazenar seus dados deve ser muitobem feita para que não haja problemas com colunas com tipos de dadoserrados ou mesmo, no pior cenário, perda de informação em seu fluxo deentrada. Uma PRIMARY KEY mal definida, por exemplo, com oatributo AUTO_INCREMENT que seja mal dimensionada, poderá parar umaaplicação com um erro de chave duplicada (DUPLICATE KEY), por exemplo.Assim como veremos mais à frente, existem vários conceitos e várias diretrizesque deveremos memorizar para que a definição de um banco de dados alcancesuas metas no tocante à tempo de resposta e consumo de recursos.Tipos de Dados Suportados Pelo MySQLO MySQL suporta as seguintes categorias de tipos de dados:
  3. 3. Tipos de Valores Numéricos: podem ser tipos inteiros, de ponto-flutuante ou deponto-fixo, ocupando de um a oito bytes por valor em disco, com exceção dotipo bit que armazena de zero a 64 bits por valor. Sãoeles: BIT, TINYINT, SMALLINT, INT,MEDIUMINT e BIGINT. Tipos denuméricos de ponto-flutante FLOAT e DOUBLE que requem quatro e oitobytes, por valor, respectivamente, e de ponto-fixo DECIMAL, que requer quatrobytes aproximadamente para cada lado, precisão e escala.Temos alguns sinônimos de alguns tipos de dados de tipo numérico: Até o MySQL 5.0.3, BIT era sinônimo de TINYINT(1); BOOL ou BOOLEAN é o mesmo que TINYINT; SERIAL é um apelido (alias) de BIGINT UNISINED NOT NULL AUTO_INCREMENT UNIQUE; INTEGER é o mesmo que INT; DEC é um sinônimo de DECIMAL.Tipos de Valores String: podem ser binários ou não-binários, podendo ocuparespaços de tamanhos fixos ou variáveis. Sãoeles: CHAR, VARCHAR, TEXT, BINARY,VARBINARY, BLOB, ENUM e SET.Os tipos de dados de valores string, se dividem em dois segmentos:Não-binários: CHAR, VARCHAR e TEXT, este último que se divide em maisoutros três, que são: TINYTEXT, MEDIUMTEXT e LONGTEXT.Binários: BINARY, VARBINARY e BLOB, este último que se divide em maisoutros três, que são: TINYBLOB, MEDIUMBLOB e LONGBLOB.Tipos de Valores Temporais: são tipos de dados utilizados normalmente paraarmazenar informações de data e hora, podendo ser somente a data ou a hora,de acordo com o contexto e pode ocupar de um a oito bytes por valor. Sãoeles: DATE,TIME, DATETIME, TIMESTAMP e YEAR.Quando nos referimos ao espaço de armazenamento para um valor de umacoluna de acordo com o seu tipo de dado, nos referimos ao espaço que cadavalor de um determinado tipo de dado ocupará no arquivo de dados em disco,ou seja, uma linha inteira ou tupla tem um somatório de bytes que pode nosprover um número médio de crescimento do banco de dados ao longo dotempo.Para facilitar a compreensão, imagine ter uma coluna do tipo INT para umatabela que armazenará tipos de sexo. Seria um desperdício de espaço, já queo tipo de dados INTpode armazenar muito mais que duas posições. Otipo TINYINT seria o mais indicado em relação ao espaço necessitado para oarmazenamento, nesse contexto.Tipos de Dados NuméricosO MySQL 5.0 suporta todos os tipos de dados padrão SQL. Todos os tipossupracitados são tipos de dados aceitos e podem ter muitos outros sinônimos –palavra que tem exatamente o mesmo sentido que outra ou quase idêntico. Oque temos que ter ciência também é quanto de espaço por valor é requeridopor cada tipo. Tais especificações são expostas na Tabela 1.
  4. 4. Tabela 1 – Tipos NuméricosOs tipos de dados numéricos, além de terem suas representações em colunas,possuem também atributos/propriedades taiscomo UNSIGNED, ZEROFILL e AUTO_INCREMENT.O UNSIGNED impede que a coluna que tenha, por exemplo, o tipo dedado INTarmazene números negativos, ou seja, valores menores que zero nãoserão permitidos. Quando omitimos o atributo UNSIGNED em uma coluna detipos de dados numéricos, seu padrão é SIGNED, ou seja, permitirá valoresnegativos. Uma observação interessante é que umacoluna AUTO_INCREMENT sempre será automaticamenteUNSIGNED, mesmose omitirmos o atributo na criação.O atributo ZEROFILL provoca efeitos de auto-preenchimento de espaços nãoutilizados em uma coluna com zeros. Digamos que temos uma tabela, quecriamos com uma coluna do tipo TINYINT(2) e fornecemos a seguirum INSERT como mostra a Figura 1. Figura 1 – Criando atabela com a coluna ZEROFILL. (MySQL Query Browser)O resultado poderá ser notado no SELECT seguinte feita na tabela de nome“tabela”: Figura 2 – Efeito deZEROFILL em uma coluna de uma tabela. (MySQL Query Browser)Perceba que como o campo tem o display “2″, adicionado ao tipo dedado TINYINT na criação da tabela, o *SGBD – leia-se Sistemas deGerenciamento de Bancos de Dados – MySQL 5.0 preenche os espaços comzeros. Caso o campo tenha o atributoZEROFILL omitido na criação de umacoluna quando criamos uma tabela, os espaços são preservados.Utilizar ZEROFILL em uma coluna, automaticamente a tornaUNSIGNED, ouseja, o campo não aceitará valores menores que zero.O atributo AUTO_INCREMENT é bastante utilizado quando se precisa criar umcampo na tabela para ser chave primária quando não temos muitas alternativasem outros atributos para que seja gerado automaticamente um identificador
  5. 5. único para cada registro que será cadastrado na tabela. Para que umcampo AUTO_INCREMENT seja criado sem problemas de compilação, acoluna criada deverá seguir determinadas diretrizes, tais como: Obrigatoriamente o tipo de dado deve ser numérico e inteiro, ou seja, a coluna pode ter tipos SMALLINT, MEDIUMINT, INT ou BIGINT; A coluna deve ser indexada (INDEX, UNIQUE INDEX ou PRIMARY KEY) e ter a restrição NOT NULL; Uma tabela somente poderá ter uma única coluna com este atributo;OBS.: A conjunção de UNIQUE INDEX + NOT NULL é igual à PRIMARY KEY.O comportamento de uma coluna AUTO_INCREMENT tem alguns pontos àsalientar. Quando atribuímos de forma explícita um valor, caso esse valor nãoseja repetido, o SGBD cadastra na coluna aquele que foi enviado e continua aseqüência a partir deste. Para deixarmos que o SGBD tome conta daseqüência dos números dessa coluna, podemos omitir a coluna da lista decolunas no comando INSERT. Não será possível omitir a lista de colunas tendouma coluna com o atributo AUTO_INCREMENT de um comando oudeclaração INSERT, a menos que você atribua um valor explicitamente, o quepode lhe trazer problemas com chave duplicada, caso esta coluna sejaindexada com uma PRIMARY KEY ou um UNIQUE INDEX.Outro fator interessante, referente ainda aos tipos de dados numéricos é que,caso tenhamos uma coluna do tipo SMALLINT UNISIGNED em umadeterminada tabela e cadastrarmos um valor maior que a largura permitida poraquele tipo de dado, o SGBD truncará o valor fornecido para o maior valorpermitido pelo tipo de dado e enviará umWARNING ao usuário. Para exibiro WARNING basta emitir o comando SHOW WARNINGS. A Figura 3 ilustraesta situação.Figura 3 – Dados são truncados e inseridos na tabela e um WARNING éenviado ao usuário.Esse comportamento poderá ser desagradável, uma vez que numa situaçãodessas, esperamos que o SGBD não aceite. Para que isso aconteça, basta queconfiguremos oSQL MODE para TRADITIONAL. Após isto, a maioriados WARNINGS disparados ao usuário serão explicitados em forma de erro,
  6. 6. não permitindo que valores indevidos, mesmo que truncados, cheguem a serinseridos, como mostra a Figura 4.Figura 4 – Configuramos o SQL MODE para TRADITIONAL e o erro foiexplicitado.O MySQL 5.0 ainda suporta os tipos de dados de ponto-flutuante, FLOAT e DOUBLEque requerem quatro e oito bytesrespectivamente. Apesar de serem mais eficientes em performace narecuperação por utilizarem um tipo numérico nativo do processamentocomputacional, estes podem apresentar erros de arredondamento. Não seriauma boa idéia utilizar tais tipos de dados para armazenar dados financeiros,como preços e valores de serviços em notação monetária. Para isto, o MySQL5.0 disponibiliza o tipo de ponto-fixo DECIMAL, que fornece mais segurançaquanto ao armazenamento de preços por exemplo por não apresentarproblemas com arredondamento, mas por outro lado são mais lentos narecuperação e cálculos. NUMERIC é o mesmo que DECIMAL e funciona damesma maneira no MySQL 5.0.As declarações abaixo são similares: DECIMAL DECIMAL(10) DECIMAL(10,0)OBS.: Já que para valores monetários, é melhor utilizarmos o tipo dedado DECIMAL, podemos definir os campos como DECIMAL(10,2), o que nosdará 10 digitos de precisão – posições antes da vírgula – e 2 posições deescala – posições após a vírgula. Para inserirmos dados num campo decimal, avígula deverá ser substituída pelo ponto (‘. ‘).Tipo de Dados BITNão temos muito a falar do tipo de dados BIT, somente que ele é um tipo dedados que armazena de 1 à 64 bits e seu valor não poderá ser recuperado comum simplesSELECT e sim em meio a uma expressão. Fazendo umsimples SELECT temos a exibição do bit-field enquanto quando fazemosum SELECT abordando o campo em meio a uma expressão simples, seu valoré retornado, como mostra a Figura 5.
  7. 7. Figura 5 – Retorno de valor real de uma coluna do tipo BIT.Conclusão da Primeira ParteVimos então neste artigo, com aplicações práticas dos conceitos e teoriasapresentadas que, o MySQL 5.0 apresenta, em ordem de quantidade deespaço requerido por valor em uma coluna, os tiposinteiros BIT, TINYINT, SMALLINT, INT, MEDIUMINT, BIGINT, os de pontoflutuante FLOAT e DOUBLE e o de ponto fixo, DECIMAL, que é o maisindicado para armazenamento de valores monetários. Vimos também quais sãoe como utilizar aspropriedades ZEROFILL, AUTO_INCREMENT e UNSIGNED, além de falarmosrapidamente do SQL MODE e espaço requerido por valor de cada tipo de dado.No próximo artigo, que compõe esse estudo, apresentaremos os tipos dedados String, ou seja, todos os dados que suportam caracteres binários e não-binários no MySQL 5.0, bem como os conjuntos de caracteres existentes esuas especificações e a tão discutida diferença entre ostipos CHAR e VARCHAR.

×