• Nenhum resultado encontrado

Conhecendo os tipos de dados

N/A
N/A
Protected

Academic year: 2021

Share "Conhecendo os tipos de dados"

Copied!
33
0
0

Texto

(1)

Conhecendo os tipos de dados

Uma das fases do projeto de bancos de dados é a escolha dos tipos de dados das colunas que constituem as tabelas. As implementações SQL oferecem várias opções de tipos e é preciso conhecer as características e limitações de cada um: uma coluna que armazena preços, por exemplo, tem requisitos diferentes de uma coluna que armazena datas, ou nomes. Para cada caso, há tipos que são mais ou menos adequados. Prevendo corretamente os valores que devem ser armazenados e fazendo a escolha certa, o projetista previne dores de cabeça e retrabalho no futuro.

Escolha certa, neste caso, significa empregar tipos que

• suportam a gama de valores que um atributo pode assumir;

• suportam as operações efetuadas sobre esses valores;1

• atendidas as condições acima, requerem o menor espaço de armazenagem possível.

Além do projeto de bancos de dados, a construção de consultas SQL é outro motivo importante para conhecer melhor os tipos de dados, pois alguns operadores são sensíveis aos tipos de dados dos atributos, como os operadores aritméticos e de comparação. Eventualmente, pode ser preciso converter alguns dados de um tipo para outro, de modo a permitir certas operações.

Este capítulo apresenta os vários tipos de dados disponíveis no Access, MySQL, Oracle e SQL Server, detalhando-os quanto à sua finalidade, gama de valores, requisitos de armazenagem e operações permitidas. As funções de conversão de dados são apresentadas no capítulo 8.

7.1 TIPOS DE DADOS

Os tipos de dados disponíveis nas implementações SQL podem ser categorizados em seis grandes grupos, a saber:

Lógicos que armazenam os valores lógicos verdadeiro e falso;

Numéricos que armazenam números, reais ou inteiros;

Calendário que armazenam registros de tempo, tais como datas e horas;

Strings que armazenam cadeias de caracteres, tais como nomes, textos, etc;

Binários que armazenam dados não regularmente estruturados, tais como figuras, fotos, sons, etc;

Específicos que armazenam dados específicos de cada implementação, tais como identificadores especiais.

Derivados que podem ser definidos pelo usuário a partir de combinações dos tipos primitivos.

1 Note que as operações abrangem ordenação de registros com base no atributo e utilização do mesmo atributo em índices, que são fatores que auxiliam na determinação correta de um tipo.

(2)

TIPOS DE DADOS LÓGICOS

Algumas implementações, como o Access, reservam um tipo de dados específico para a armazenagem de valores lógicos, como verdadeiro/falso ou sim/não. Esses tipos são ditos lógicos porque possuem um domínio de apenas dois valores, além do valor nulo. Tipos lógicos são manipulados através dos operadores lógicos como not, and, or, que os combinam em expressões lógicas.

Algumas implementações não distinguem entre tipos lógicos e outros tipos, sendo possível construir expressões lógicas onde qualquer tipo pode ter o papel que seria de um tipo lógico.

Leia mais sobre isto nas seções que detalham os tipos de cada implementação.

TIPOS DE DADOS NUMÉRICOS

Há três tipos básicos de tipos de dados numéricos nas implementações de bancos de dados:

números reais de ponto flutuante, números inteiros, com e sem sinal, e números decimais, que são números reais com ponto fixo.

Os números reais de ponto flutuante são velhos conhecidos dos computadores, e normalmente apresentam-se com precisão simples (armazenados em 4 bytes) ou dupla (armazenados em 8 bytes), dependendo da gama de valores requerida. Embora permitam números de alta ordem, os números de ponto de flutuante, por sua própria concepção, têm a desvantagem de serem representados por valores às vezes aproximados. Por este motivo, são pouco indicados para representar grandezas financeiras, uma vez que os valores, neste caso, têm que ser exatos.

Os números inteiros são bastante utilizados em aplicações de bancos de dados e apresentam-se em tipos cujos valores permitidos variam sensivelmente. Tipicamente, há inteiros com 1, 2, 4 e 8 bytes, o que requer especial atenção do projetista na escolha do tipo adequado. Por exemplo, um atributo que represente o número de itens numa nota fiscal certamente tem valores muito diferentes do que outro que represente a quantidade de refrigerantes vendidos no mundo nos últimos 12 meses. Além disso, os números inteiros podem ter sinal ou não. Por exemplo, um número inteiro de um byte pode representar valores entre –128 e 127, se o sinal for considerado, ou valores entre 0 e 255, sem sinal. Isto pode representar uma diferença importante se o sinal não for necessário, como no caso dos itens da nota fiscal.

Os números decimais são uma representação especial de números reais, com ponto fixo: o número total de dígitos e o número de casas decimais é estabelecido na definição do tipo. Com isso, fica mais apropriada a manipulação de valores financeiros (o que é muito comum em bancos de dados), pois pode-se ter números reais não aproximados.

Números decimais têm precisão e escala. Precisão determina o número máximo de dígitos no número e escala determina quantos desses dígitos estão à direita do ponto decimal. Note que, para números de ponto flutuante não há uma escala pré-determinada, daí sua denominação.

Normalmente, um valor que tem mais casas decimais que seu tipo determina é arredondado; se tiver mais dígitos à esquerda do ponto decimal, é truncado. Veja alguns exemplos de valores fornecidos, tipos e valores armazenados.

56374,5689 DECIMAL (14,4) 56374,5689 56374,5689 DECIMAL (14,3) 56374,569 56374,5689 DECIMAL (14,0) 56375

Em algumas implementações admite-se escala negativa. Neste caso, o número é arredondado antes da casa decimal. Exemplos

56374,5689 DECIMAL (14,-1) 56370 56374,5689 DECIMAL (14,-2) 56400

(3)

Também é possível o caso em que a precisão é menor que a escala. Neste caso, limita-se o número de dígitos que aparecem após a casa decimal, como nos exemplos a seguir.

0,0000005689 DECIMAL (2,7) 0,0000005

0,05689 DECIMAL (3,4) 0,0568

A implementação de números decimais pode variar bastante, pois um número decimal pode ser armazenado como um inteiro escalado (com uma parte decimal imaginária), uma string de dígitos numéricos que é convertida quando operada, ou outras formas compactadas. Números decimais podem ter sinal ou não.

Tipos numéricos podem ser operados livremente através dos operadores aritméticos e de comparação. Normalmente, quando um ou mais tipos numéricos distintos são envolvidos numa operação aritmética, todos são convertidos para um tipo comum (o mais genérico) e então as operações são realizadas. Ao final da expressão, o resultado é convertido para o tipo designado para receber o valor final da expressão. Por exemplo, a soma de dois inteiros, de 1 e 4 bytes, respectivamente, pode ser feita convertendo-se o operando de 1 byte para uma representação de 4 bytes. O resultado produzido é um inteiro de 4 bytes. Já para uma operação aritmética entre um inteiro e um real, os dois operandos devem estar representados como reais, assim como o resultado da operação.

TIPOS DE DADOS DE CALENDÁRIO

Normalmente, registros de tempo são representados como um determinado instante numa certa escala. Essa escala pode ser mais ou menos precisa, de acordo com o espaço de armazenagem disponível.

Vamos supor que seja necessário registrar o instante 05/03/2007 14:12:00. Vamos também supor que o instante de referência seja 01/01/1900 00:00:00 e que a precisão seja de minutos.

Neste caso, bastaria armazenar o número de minutos decorridos entre o instante de referência e o instante sendo registrado. Esse número seria 56368212! Ou seja, há 56368212 minutos entre a zero hora do dia 01/01/1900 e as quatorze horas e doze minutos do dia 05/03/2007. O mesmo raciocínio seria aplicado aos instantes anteriores ao de referência: o instante 31/12/1899 23:59:00 seria representado como –1. O gráfico abaixo ilustra uma escala de tempo.

Representação interna Tempo

56368274 05/03/2007 15:14:00 56368273 05/03/2007 15:13:00 T1 56368272 05/03/2007 15:12:00 56368271 05/03/2007 15:11:00

... ...

... ... ...

... ...

2 01/01/1900 00:02:00

1 01/01/1900 00:01:00

T0 0 01/01/1900 00:00:00

-1 31/12/1899 23:59:00

-2 31/12/1899 23:58:00

... ...

... ... ...

Se a precisão fosse de dias, seriam 39144 unidades entre 01/01/1900 e 05/03/2007. Observamos que, dependendo da precisão requerida, o tamanho em bytes do número que representa a diferença pode ser maior ou menor. No caso de minutos, seriam necessários pelo menos 26 bits;

com precisão de dias, 17 bits fariam o serviço.

(4)

O espaço de memória necessário para armazenar um instante de tempo (seja data, horário ou a combinação de ambos) depende: da precisão requerida e da amplitude que se deseja cobrir.

Note que se fôssemos armazenar o instante 31/12/5015 13:24:00, com precisão de milisegundos, teríamos grande precisão (milisegundos) e grande amplitude (mais de 5.000 anos!).

Aplicações de bancos de dados, na maior parte das vezes, não requerem muita amplitude e precisão. Datas de nascimento e datas de transações comerciais, por exemplo, estão adequadamente cobertas com amplitudes próximas de 200 anos, para o passado e para o futuro, com precisão de dias. Alguns registros de tempo, entretanto, podem requerer maior precisão, tais como os atributos que registram o exato momento em que as transações foram efetuadas, onde uma precisão de segundos, ou até de milisegundos, pode ser necessária. De qualquer forma, há vários graus de precisão e amplitude nas implementações que permitem uma escolha bastante adequada.

Os tipos que registram tempo devem permitir alguma forma de aritmética sobre seus valores.

Calcular as datas de uma prestação mensal a partir de uma data base, somando-se um mês a cada passo, ou calcular o número de dias decorridos entre duas datas ou, ainda, calcular o núme- ro de minutos entre dois registros de tempo são exemplos de operações usuais sobre esses tipos que devem estar disponíveis ao programador SQL. Além disso, tipos que armazenam registros de tempo são inerentemente estruturados: ano, mês, dia, hora, etc, são componentes naturais da nossa concepção de tempo e a capacidade de isolar e manipular esses componentes é um requisito primordial.

TIPOS DE DADOS STRINGS

São tipos de dados que armazenam coleções de caracteres. Caracteres representam símbolos gráficos, ou de controle, e têm uma estrutura uniforme, dependendo do conjunto com o qual se trabalhe. Existem dezenas de diferentes padrões de caracteres, tais como ASCII, EBCDIC, Unicode (Padrão de Caracteres da ISSO - International Standards Organization), etc. De acordo com o padrão, o número de bytes necessários para representar um caracter pode variar. Há conjuntos monobyte, como o código ASCII, e conjuntos multibyte, como alguns alfabetos asiáticos. Os conjuntos podem ser diferenciados entre si: um mesmo código pode representar diferentes caracteres gráficos em diferentes conjuntos. Isso ocorre, principalmente, com conjuntos de caráter nacional: o conjunto padrão (ou padrão nacional) utilizado na Grécia é bem diferente do conjunto padrão utilizado no Brasil!

Muitos dos conjuntos de caracteres utilizados estão limitados ao máximo de 256 caracteres, uma vez que dispõem de somente 8 bits para representar cada caracter. Com a explosão da utilização dos computadores e com a sofisticação dos equipamentos como impressoras e monitores, muitos outros caracteres passaram a ser utilizados, tais como símbolos matemáticos, letras gregas, setas e outros grafismos que demandam uma expansão nos conjuntos de caracteres. O conjunto Unicode visa a solucionar este problema. Com códigos de 16 bits, ou 2 bytes, o número de possibilidades passa para 65.536 caracteres, o que é suficiente para acomodar quase todos os conjunto existentes.

Outro aspecto é o tamanho do código de cada caracter no âmbito do padrão. É possível que se tenham caracteres com códigos de comprimento diferente. Assim, as letras mais comumente usadas podem ter códigos mais curtos, enquanto os caracteres mais raros podem ocupar mais espaço. Este é um princípio bastante empregado em algoritmos de compactação de dados.

Alguns implementações, como Oracle, são capazes de manipular conjuntos de caracteres com códigos de tamanho variável.

As implementações SQL são capazes de identificar os conjuntos de caracteres em uso e manipulá-los adequadamente. Note que a busca de um padrão num conjunto de caracteres de 1 byte é diferente da busca de um padrão num conjunto multibyte. Essas diferenças devem ser transparentes para o programador SQL e resolvidas pela implementação, automaticamente.

(5)

As operações usuais sobre strings são bastante simples, resumindo-se à concatenação, desmembramento em substrings e busca de substrings. Entretanto, uma característica importante é a capacidade de armazenar valores com comprimentos variáveis. Nomes de pessoas e empresas, títulos de livros e endereços são exemplos em que as diferenças de tamanho de um valor para outro podem ser consideráveis. A capacidade de manipular campos variáveis torna-se, assim, um importante fator de diferenciação dos tipos string.

TIPOS DE DADOS BINÁRIOS

São tipos de dados não estruturados. Embora normalmente sejam tratados genericamente como caracteres, na verdade dados binários não têm necessariamente esta característica. Uma figura, por exemplo, é um mapa de bits que não configuram caracteres específicos. Normalmente, dados binários são tratados como um todo, pois não há uma estrutura prevalecente.

TIPOS DE DADOS ESPECÍFICOS

Cada implementação possui peculiaridades próprias e essas peculiaridades podem se manifestar através da existência de tipos específicos, exclusivos. Esses tipos de dados serão tratados separadamente.

TIPOS DE DADOS DERIVADOS

A redigir ???.

TIPOS DE DADOS NO ACCESS,MYSQL,ORACLE E SQLSERVER

As seções seguintes deste capítulo apresentam, de forma completa, os tipos de dados disponíveis em cada uma das quatro implementações SQL consideradas neste livro. Os tipos são identificados pelo nome principal, juntamente com seus sinônimos. Isto é útil porque, conhecendo-se os tipos e os sinônimos válidos em cada implementação, fica mais fácil produzir scripts SQL que sejam portáteis.

Cada tipo é detalhado com relação à gama de valores que suporta e ao espaço requerido para armazenagem.

7.2 TIPOS DE DADOS NO ACCESS

QUADRO RESUMO DOS TIPOS DE DADOS NO ACCESS

Tipo Sinônimos

Lógicos BIT LOGICAL, LOGICAL1, YESNO BYTE INTEGER1

SHORT INTEGER2, SMALLINT LONG INT, INTEGER, INTEGER4 SINGLE FLOAT4, IEEESINGLE, REAL

DOUBLE FLOAT, FLOAT8, IEEEDOUBLE, NUMBER, NUMERIC Numéricos

CURRENCY MONEY

Tempo DATETIME DATE, TIME, TIMESTAMP

(6)

TEXT ALPHANUMERIC, CHAR, CHARACTER, STRING, VARCHAR String

LONGTEXT LONGCHAR, MEMO, NOTE BINARY VARBINARY

Binários

LONGBINARY GENERAL, OLEOBJECT GUID

Específicos

COUNTER AUTOINCREMENT

TIPOS LÓGICOS NO ACCESS

Access implementa o tipo BIT, definido expressamente como um tipo lógico, isto é, que pode assumir os valores true e false, além do valor nulo. Se T é uma tabela onde a é um atributo definido com o tipo BIT (ou LOGICAL, LOGICAL1, YESNO), é possível escrever uma consulta como

select * from T where a

uma vez que um atributo de um tipo lógico pode fazer o papel de uma expressão lógica. Esta consulta seria equivalente a

select * from T where a = true

Atenção, porém, porque esta construção também é válida para atributos de outros tipos, que não lógicos. Uma consulta como

select * from inscricao where nota

produz como resultado

matricula coddisciplina nota

1001 317 8,0

1002 210 9,5

1005 316 3,0

1005 117 4,2

1007 114 7,0

1010 317 5,5

1010 316 10,0

Os registros com notas nulas não aparecem no resultado, assim como não apareceriam registros com notas iguais a zero. Isto ocorre porque são considerados verdadeiros os valores diferentes de zero (notas negativas teriam aparecido).

Mesmo uma consulta como

select * from aluno where nome

seria possível! Compõem o resultado todos os registros em que o atributo nome não é nulo. O mesmo raciocínio aplica-se a campos com tipos de calendário.

(7)

As duas consultas a seguir mostram como um valor lógico é apresentado no resultado de uma consulta.

Na primeira consulta, a segunda coluna contém o resultado da expressão nota > 5, cujo valor pode ser verdadeiro, falso ou nulo, representados, respectivamente, com –1, 0 e null. Na segunda consulta, equivalente à primeira, a segunda coluna inclui no resultado, expressamente, os literais true, false e null, de acordo com o resultado da expressão lógica.

TIPOS DE CALENDÁRIO NO ACCESS

Os valores de tempo são armazenados sob o tipo datetime, que consiste num número real de 8 bytes, com precisão de minutos. O instante de referência é zero hora do dia 30/12/1899. A amplitude engloba datas do ano 0008 até o ano 9999. A parte inteira do número representa o número (positivo ou negativo) de dias decorridos da data do instante de referência. A parte decimal do número representa a fração do dia correspondente ao horário sendo armazenado.

O instante que correspondente às 12 horas do dia 01/01/1900 é representado pelo número 2,5.

A parte inteira, 2, é o número de dias decorridos desde 30/12/1899. A parte decimal, 0,5, corresponde ao horário do meio-dia, que é exatamente a metade de um dia. Outro exemplo:

36891,75 é o número que corresponde às 18 horas do dia 31/12/2000.

O Access permite operações aritméticas sobre operandos do tipo de registro de tempo. Como uma data é sempre armazenada como um número, pode-se somar ou subtrair valores, que são transformados em unidades de tempo. Por exemplo, somando-se 1 a um registro de tempo obtém-se o registro de tempo, com o mesmo horário, do dia seguinte. Somando-se 1/24 a um registro de tempo obtém-se o registro de tempo de uma hora depois. Embora este seja um recurso útil por vezes, a manipulação de datas é mais segura com as funções apropriadas para este fim, apresentadas no capítulo 8. A consulta a seguir produz a lista de alunos juntamente com suas datas de nascimento e a data em que completam 10.000 dias de vida.

nota 'maior que cinco?' NULL NULL

8,00 -1 9,50 -1 3,00 0 4,20 0 NULL NULL 7,00 -1 5,50 -1 10,00 -1 select nota,

nota > 5 as 'maior que cinco?' from inscricao

select nota,

iif(nota > 5, true, iif(nota <= 5, false, null)) as 'maior que cinco?' from inscricao

nome nascimento dia10000 Ricardo Biondi 21/02/80 09/07/07 Maria Rita Colatti 10/11/78 28/03/06 Oscarito Vianna 14/08/79 30/12/06 Barbara Carlito 29/10/79 16/03/07 Carlos Maradona 30/06/77 15/11/04 Sacadura Miranda 12/12/81 29/04/09 Maria Lucia Silva 10/08/75 26/12/02 select nome,

nascimento,

nascimento +10000 as dia10000 from aluno

(8)

A próxima consulta é mostrada a título de curiosidade, uma vez que sua utilidade beira o zero absoluto. Sendo a data de nascimento armazenada como um número, é possível imaginar algo como

Uma distante, mas possível, utilidade para essa construção é a geração de números aleatórios, vistos no capítulo 8.

TIPOS NUMÉRICOS NO ACCESS

Os tipos numéricos no Access cobrem inteiros BYTE, SHORT, LONG, de 1, 2 e 4 bytes e números de ponto flutuante, SINGLE, DOUBLE, de 4 e 8 bytes, respectivamente. O tipo CURRENCY (ou MONEY), é um exemplo aproximado de número decimal, porque é definido com 4 casas decimais, mas o Access não permite que o número total de dígitos seja definido: são sempre 19 dígitos. Na verdade, este tipo é armazenado como um inteiro escalado, pois tem a mesma gama de valores do tipo LONG, consideradas as decimais em todas as operações em que aparece como operando.

TIPOS STRING NO ACCESS

Os tipos string armazenam caracteres ASCII, com um byte por caracter. Há dois tipos, sendo um para strings curtas, até 255 caracteres e outro, para strings muito longas, com até 1,2 Gbytes.

TIPOS BINÁRIOS NO ACCESS

Quanto aos tipos binários, há dois tipos, sendo um variável, com até 255 bytes e outro longo, adequado para armazenar figuras, documentos do Office, mapas de bits, sons e outros valores não organizados como caracteres.

TIPOS ESPECÍFICOS NO ACCESS

Os tipos específicos COUNTER e GUID permitem a geração de códigos identificadores de registros.

COUNTER é um número seqüencial, armazenado como um inteiro LONG, que não se repete na tabela onde foi utilizado. Já o tipo GUID, conhecido também como Código de Replicação, garante códigos de 16 bytes que não se repetem em outros registros.

RELAÇÃO COMPLETA DOS TIPOS DE DADOS NO ACCESS

ALPHANUMERIC

O mesmo que TEXT.

AUTOINCREMENT

O mesmo que COUNTER.

nascimento produto 21/02/80 856849984 10/11/78 829670416 14/08/79 845704561 29/10/79 850130649 15/07/79 843960601 12/12/81 895924624 10/08/75 762643456 select nascimento,

nascimento * nascimento as produto from aluno

(9)

BINARY(t)

Dados binários de formato livre, de comprimento variável n, 0 ≤ n ≤ t ≤ 255.

Tamanho: 1 + n bytes Sinônimos: VARBINARY BIT

Valores lógicos, verdadeiro e falso, armazenados como os números –1 e 0, respectivamente.

Tamanho: 1 byte

Sinônimos: LOGICAL, LOGICAL1, YESNO BYTE

Números inteiros, sem sinal, entre 0 e 255.

Tamanho: 1 byte Sinônimos: INTEGER1 CHAR

O mesmo que TEXT.

CHARACTER

O mesmo que TEXT.

CURRENCY

Números entre –922.337.203.685.477,5808 e 922.337.203.685.477,5807, com 4 casas decimais fixas. Valores com mais de 4 casas decimais são truncados na quinta decimal.

Tamanho: 8 bytes Sinônimos: MONEY COUNTER

Números utilizados em colunas com auto-incremento, armazenados como LONG. Tamanho: 4 bytes

Sinônimos: AUTOINCREMENT DATETIME

Registros de tempo entre os anos 0008 e 9999, com precisão de minutos.

Tamanho: 8 bytes Sinônimos: DATE, TIME, TIMESTAMP DATE

O mesmo que DATETIME.

DOUBLE

Um valor de ponto flutuante de dupla precisão com um intervalo de – 1,79769313486232 × 10308 a – 4,94065645841247 × 10-324 para valores negativos, 4,94065645841247 × 10-324 a 1,79769313486232 × 10308 para valores positivos e 0.

Tamanho: 8 bytes

Sinônimos: FLOAT, FLOAT8, IEEEDOUBLE, NUMBER, NUMERIC FLOAT

O mesmo que DOUBLE.

FLOAT4

O mesmo que SINGLE.

FLOAT8

O mesmo que DOUBLE.

GENERAL

O mesmo que LONGBINARY.

GUID

Um número de identificação exclusivo utilizado com chamadas de procedimento remoto.

Também conhecido por código de replicação, garante um identificador que não se repete em outros registros.

Tamanho: 16 bytes Sinônimos: nenhum

(10)

IEEESINGLE

O mesmo que SINGLE.

IEEEDOUBLE

O mesmo que DOUBLE.

INT

O mesmo que LONG.

INTEGER

O mesmo que LONG.

INTEGER1

O mesmo que BYTE.

INTEGER2

O mesmo que SHORT.

INTEGER4

O mesmo que LONG.

LOGICAL

O mesmo que BIT.

LOGICAL1

O mesmo que BIT.

LONG

Números inteiros, com sinal, entre – 2.147.483.648 e 2.147.483.647.

Tamanho: 4 bytes

Sinônimos: INT, INTEGER, INTEGER4 LONGBINARY

Formato livre, de zero até 1,2 Gbytes.

Tamanho: variável, dependendo do tamanho do atributo Sinônimos: GENERAL, OLEOBJECT

LONGCHAR

O mesmo que LONGTEXT.

LONGTEXT

Strings de caracteres, de comprimento variável n, 0 ≤ n ≤ t ≤ 1,2 Gbytes.

Tamanho: 4 + n bytes

Sinônimos: LONGCHAR, MEMO, NOTE MEMO

O mesmo que LONGTEXT.

NOTE

O mesmo que LONGTEXT.

NUMBER

O mesmo que DOUBLE.

NUMERIC

O mesmo que DOUBLE.

OLEOBJECT

O mesmo que LONGBINARY.

REAL

O mesmo que SINGLE.

SHORT

Números inteiros, com sinal, entre – 32.768 e 32.767.

Tamanho: 2 bytes Sinônimos: INTEGER2, SMALLINT SINGLE

(11)

Números reais com precisão simples entre -3,402823 × 1038 e – 1,401298 × 10-45 para valores negativos; -1,401298 × 10-45 e 3,402823 × 1038 para valores positivos.

Tamanho: 4 bytes

Sinônimos: FLOAT4, IEEESINGLE, REAL SMALLINT

O mesmo que SHORT.

STRINGT

O mesmo que TEXT.

TEXT(t)

Strings de caracteres, de comprimento variável n, 0 ≤ n ≤ t ≤ 255.

Tamanho: 1 + n bytes

Sinônimos: ALPHANUMERIC, CHAR, CHARACTER, STRING, VARCHAR TEXT

O mesmo que TEXT(255).

TIME

O mesmo que DATETIME.

TIMESTAMP

O mesmo que DATETIME.

VARBINARY

O mesmo que BINARY.

VARCHAR

O mesmo que TEXT.

YESNO

O mesmo que BIT.

7.3 TIPOS DE DADOS NO MYSQL

QUADRO RESUMO DOS TIPOS DE DADOS NO MYSQL

Tipo Sinônimos TINYINT BIT, BOOL

SMALLINT MEDIUMINT

INT INTEGER

BIGINT FLOAT

DOUBLE DOUBLE PRECISION, REAL Numéricos

DECIMAL DEC, NUMERIC DATE

DATETIME TIMESTAMP TIME Tempo

YEAR

CHAR NATIONAL CHAR, NCHAR

CHAR BINARY NATIONAL CHAR BINARY, NCHAR BINARY, CHAR BYTE

(12)

VARCHAR NATIONAL VARCHAR, VARCHARACTER TEXT

TINYTEXT MEDIUMTEXT String

LONGTEXT TINYBLOB BLOB MEDIUMBLOB Binários

LONGBLOB ENUM Específicos

SET

TIPOS LÓGICOS NO MYSQL

No MySQL não há um tipo de dados que expressamente armazene os valores lógicos verdadeiro e falso. Entretanto, os mesmos efeitos podem ser facilmente simulados. As duas consultas a seguir ilustram claramente este aspecto. A primeira delas produz como resultado a lista de notas da tabela Inscrição e o valor lógico resultante da expressão lógica

nota > 5

A segunda consulta produz exatamente o mesmo resultado, porém obtido a partir do uso explícito dos literais true e false na sua lista alvo. Nos dois casos, observa-se que o valor verdadeiro ( ou true) é 1 e o valor falso (ou false) é 0. Com isso, pode-se inferir corretamente que qualquer valor numérico, diferente de zero, vale como o valor verdadeiro numa expressão lógica e que qualquer valor igual a zero vale como falso.

O efeito disso é que uma consulta como

select * from inscricao where nota

nota 'maior que cinco?' NULL NULL

8,00 1 9,50 1 3,00 0 4,20 0 NULL NULL 7,00 1 5,50 1 10,00 1 select nota,

nota > 5 as 'maior que cinco?' from inscricao

select nota,

if(nota > 5, true, if(nota <= 5, false, null)) as 'maior que cinco?' from inscricao

(13)

produz uma lista com todos os registros de INSCRIÇÃO que não possuem notas nulas, como havíamos constatado no Access. Isto não significa que uma consulta como

select * from inscricao where nota = true

seja equivalente. O teste de igualdade acima é sempre e o resultado, vazio. Mas, o que acontece se usarmos valores do tipo string nesta situação? Diferentemente do que acontece no Access, a consulta

select * from aluno where nome

produz um resultado vazio (no Access aparecem todos os alunos para esta consulta!). Note que a conversão do nome para um tipo numérico retorna zero, como veremos no capítulo 8. Por fim, a consulta

select * from aluno where nascimento

retorna todos os alunos que não têm a data de nascimento nula.

Em suma, qualquer expressão, numérica ou não, pode ser utilizada no papel de uma expressão lógica. Se o seu valor, convertido para um tipo numérico, for diferente de zero, a expressão é verdadeira; caso contrário, é falsa. Expressões numéricas no papel de expressões lógicas podem ser combinadas pelos operadores lógicos, o que permite uma consulta como

select * from aluno where 0 or 1

TIPOS NUMÉRICOS NO MYSQL

O MySQL oferece quatro tipos de inteiros, com 1, 2, 3, 4 e 8 bytes (TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT). Todos podem ser declarados com signed ou unsigned (com ou sem sinal). Os números reais de ponto flutuante podem ter precisão simples ou dupla (FLOAT e DOUBLE), e também ser definidos com signed ou unsigned. Neste caso, a gama de valores não é alterada, nem o modo de armazenagem: simplesmente, no caso de unsigned, os valores negativos são desabilitados.

O tipo DECIMAL permite a armazenagem de números reais de ponto fixo. Na declaração, são determinados o número total de dígitos e o número de casas decimais. Esses números são armazenados como strings mas, como devem ser convertidos para números reais para ser operados, têm sua gama de valores restrita à gama dos números reais de dupla precisão.

TIPOS STRING NO MYSQL

MySQL oferece duas opções básicas de tipos string: com tamanho fixo ou variável. O tipo CHAR

define strings de tamanho fixo com até 255 caracteres. Se uma string menor que o tamanho é armazenada, a mesma é completada com caracteres espaço, no final. Quando recuperada, os brancos no final são todos retirados. O tipo VARCHAR define strings de tamanho variável, limitadas em 255 caracteres. Espaços em branco ao final da string são removidos quando esta é armazenada. Tanto os tipo CHAR e VARCHAR podem ser acompanhados das palavras-chave BINARY

e NATIONAL. A primeira significa que as strings devem ser ordenadas com sensibilidade de maiúsculas e minúsculas. A segunda palavra-chave determina que o conjunto de caracteres usado para as strings deve ser o padrão nacional. Isto já é default no MySQL, que usa o padrão ISO-8859-1 (Latin1) como conjunto padrão. O conjunto padrão pode ser alterado pela opção –-

(14)

8859-1 (Latin1) como conjunto padrão. O conjunto padrão pode ser alterado pela opção –- default-character-set. O MySQL permite que, através de seus arquivos de configuração, novos conjuntos de caracteres sejam definidos e utilizados pelo servidor.

Outros quatro tipos de tamanho variável são disponíveis no MySQL: TEXT, TINYTEXT, MEDIUMTEXT e LONGTEXT. A diferença entre eles está no tamanho máximo admitido em cada caso, respectivamente 65.535, 255, 16.777.215 e 4.294.967.295 caracteres. De fato, os tipos *TEXT e

*BLOB são bastante semelhantes, exceto pelo critério de ordenação: sensível a maiúsculas e minúsculas para *BLOB e insensível para *TEXT.

MySQL, por sua conta, altera os tipos de uma tabela observando que

• tipos VARCHAR com tamanho menor que 4 caracteres são criados como CHAR;

• se há um tipo de tamanho variável em alguma coluna, todo registro passa a ter tamanho variável e todos os tipos CHAR com mais de 3 caracteres são criados como VARCHAR.

Atributos do tipo *TEXT podem ser referenciados nas cláusulas order by e group by. Contudo, são considerados apenas os primeiros bytes do campo. A variável max_sort_lenght determina quantos bytes são usados. O default é 1.024, mas pode ser alterado com a opção -O.

TIPOS DE CALENDÁRIO NO MYSQL

MySQL trabalha com cinco tipos de dados para registro de tempo. O tipo date tem precisão de dias, e portanto representa datas redondas, com uma amplitude de quase 9.000 anos, de 01/01/1000 00:00:00 até 31/12/9999 00:00:00. O tipo datetime é o mais preciso e de maior amplitude, suportando tempos entre 01/01/1000 00:00:00 até 31/12/9999 23:59:59, com precisão de segundos. O tipo timestamp oferece a mesma precisão, de segundos, numa amplitude menor, e registra tempos desde 01/01/1970 00:00:00 até o ano de 2037. O tipo time

serve para registrar intervalos de tempo em horas, minutos e segundos e suporta uma escala relativa entre -838:59:59 e +838:59:59. Usualmente, este tipo é usado como um cronômetro, pois não é automaticamente conversível para dias. O quinto e último tipo, year, serve para a armazenagem de anos, com dois ou quatro dígitos. Com dois dígitos, representa os anos entre 1970 e 2069. Com quatro dígitos, registra anos entre 1901 e 2155.

O programador deve ser cuidadoso com as datas no MySQL porque não há um teste sobre sua validade. Embora o ano deva estar entre 1000 e 9999, o mês entre 0 e 12 e o dia entre 0 e 31, é possível registrar algo como 31/11/2010! Também é possível registrar 00/11/1980 ou 10/00/1960. Este último caso pode ser usado como um recurso, por exemplo, quando se tem dados incompletos sobre alguma data, embora a aritmética de datas não funcione corretamente sobre esses valores.

Quando o valor nulo é atribuído a uma coluna do tipo TIMESTAMP, na verdade o MySQL armazena a data e hora correntes para aquele valor. Por este motivo, é irrelevante permitir ou não valores nulos para uma coluna deste tipo. Vide capítulo 11.

Os tipos de calendário permitem operações aritméticas sobre seus valores, embora com resultados por vezes imprevisíveis! A consulta abaixo ilustra este aspecto.

(15)

Além do nome de cada aluno, a consulta produz mais cinco colunas. A primeira mostra a data de nascimento. Na segunda, aparece o número que corresponde à data de nascimento do aluno.

Note que somando 0 a uma data força a conversão de tipo, de registro de tempo para inteiro. É possível observar que o número contém exatamente ano/mês/dia, nesta ordem. Este é o problema, ilustrado na terceira coluna: somado-se 10.000 à data de nascimento, tem-se um número que não corresponde à data de dez mil dias depois, como tínhamos no Access. Note que para a data 30/06/1977 o número é 19770630 (terceira coluna) que somado a 10.000 resulta em 19780630 na quarta coluna. A conversão deste último para data, através da função cast, retorna 30/06/78 na quinta coluna. Ou seja, um ano depois e não 10.000 dias como queríamos.

Um ano depois porque somamos uma unidade na quinta casa decimal à esquerda, que corresponde exatamente ao ano no citado número! A sexta coluna mostra a data correta, obtida através da função date_add, que corresponde a 10.000 dias após o nascimento de cada aluno.

As funções cast e date_add são explicadas em detalhes no capítulo 8.

Outro caso interessante é mostrado a seguir.

Neste exemplo, aparecem as datas dos dias seguintes, obtidos somando-se 1 à data de nascimento de cada aluno. Note que, somando-se apenas 1 o resultado está aparentemente correto. Mas há um problema: na quinta linha, aparece a data 31/06/77, que é inválida.

Embora seja um recurso bastante comum entre programadores SQL, a aritmética de datas nem sempre funciona corretamente no MySQL. Todas as operações com datas devem preferencialmente ser efetuadas através das funções de calendário, apresentadas no capítulo 8.

TIPOS BINÁRIOS NO MYSQL

Há quatro tipos binários no MySQL: BLOB, TINYBLOB, MEDIUMBLOB e LONGBLOB. A diferença está no tamanho máximo admitido em cada caso, respectivamente 65.535, 255, 16.777.215 e

nome nascimento nascimento_n dia10000_n dia10000_d dia10000_OK Ricardo Biondi 21/02/80 19800221 19810221 21/02/81 09/07/07

Maria Rita Colatti 10/11/78 19791110 19791110 10/11/79 28/03/06 Oscarito Vianna 14/08/79 19790814 19800814 14/08/80 30/12/06 Barbara Carlito 29/10/79 19791029 19800129 29/10/80 16/03/07 Carlos Maradona 30/06/77 19770630 19780630 30/06/78 15/11/04 Sacadura Miranda 12/12/81 19811212 19821212 12/12/82 29/04/09 Maria Lucia Silva 10/08/75 19750810 19760810 10/08/76 26/12/02 select nome,

nascimento as nascimento_d, nascimento+0 as nascimeto_n, nascimento +10000 as dia10000_n,

cast(nascimento+1000 as date) as dia10000_d,

date_add(nascimento, INTERVAL 10000 DAY) as dia10000_OK from aluno

nascimento dia_seguinte 21/02/80 22/02/80 10/11/78 11/11/78 14/08/79 15/08/79 29/10/79 30/10/79 30/06/77 31/06/77 12/12/81 13/12/81 10/08/75 11/08/75 select nascimento,

cast(nascimento+1 as date) as dia_seguinte from aluno

(16)

4.294.967.295 caracteres. Tipos *BLOB e *TEXT são bastante semelhantes, exceto pelo critério de ordenação: sensível a maiúsculas e minúsculas para *BLOB e insensível para *TEXT.

A exemplo dos tipos *TEXT, atributos dos tipos *BLOB também podem ser referenciados nas cláusulas order by e group by. Contudo, são considerados os primeiros bytes do campo apenas.

A variável max_sort_lenght é determina quantos bytes são usados. O default é 1024, mas pode ser alterado com a opção -O.

TIPOS ESPECÍFICOS NO MYSQL

O tipo ENUM permite estabelecer os possíveis valores de strings para uma coluna. Esses valores podem ser referenciados por seus valores literais ou pela posição relativa de cada um. Por exemplo, se uma coluna definida como

ENUM (‘amarelo’, ‘verde’, ‘azul’)

Somente algum desses valores, além do valor nulo e da string vazia podem armazenados nesta coluna. A ordem em que são enumerados os valores define também o critério de ordenação da coluna. No caso acima, os registros com o valor ‘verde’ apareceriam antes daqueles que têm

‘azul’. Um atributo do tipo ENUM referenciado num contexto numérico toma o valor de sua posição na lista que o define (contado a partir de 1). Assim, se o valor de x é ‘verde’ a expressão x+0 tem valor 2. Um tipo enumerado pode ter até 65535 elementos. Um tipo enumerado requer o espaço de armazenagem de um ou dois bytes dependendo do número de elementos.

O tipo SET é uma string especial que pode conter uma combinação de um ou mais valores de uma lista que é fornecida por ocasião da criação da tabela. Uma coluna criada com o tipo

SET ('amarelo', 'verde', 'azul')

Pode conter os valores

'amarelo' 'amarelo', 'verde' 'amarelo', 'azul' 'verde' 'verde', 'azul' 'azul'

'amarelo', 'verde', 'azul'

além do valor nulo e da string vazia. Pode haver até 64 diferentes valores. Cada elemento, a partir da esquerda da lista, corresponde a um número que é uma potência de 2 de acordo com a posição do elemento. Assim, o valor “amarelo” corresponde a 1; “verde” corresponde a 2 e

“azul” corresponde a 4. Um conjunto com os valores “verde” e “azul” corresponderia ao valor 6 e o conjunto com os três elementos teria valor 7. Um atributo do tipo set pode ser manipulado como um número ou como uma string. Veja a função find_in_set no capítulo 8.

RELAÇÃO COMPLETA DOS TIPOS DE DADOS NO MYSQL

BIGINT

Números inteiros: entre –9.223.372.036.854.775.808 e 9.223.372.036.854.775.807, se declarado como signed; entre 0 e 18.446.744.073.709.551.615, se declarado como unsigned.

Tamanho: 8 bytes Sinônimos: nenhum

BIT

O mesmo que TINYINT.

BLOB

Formato livre, com até 65.535 caracteres; ordenado com sensibilidade para maiúsculas e minúsculas.

(17)

Tamanho: comprimento do campo + 2 bytes Sinônimos: nenhum

BOOL

O mesmo que TINYINT.

CHAR (t)

String de caracteres, de tamanho fixo t, 0 ≤ t ≤ 255; quando armazenada, preenchida com espaços à direita até completar o tamanho; quando recuperada, espaços à direita são removidos;

CHAR(0) é permitido, porém os únicos valores permitidos são null e a string de zero caracteres.

Tamanho: 1 + t bytes Sinônimos: NATIONAL CHAR (t) CHAR

O mesmo que CHAR (1).

CHAR (t) BINARY

Semelhante a CHAR (t), porém com sensibilidade para maiúsculas e minúsculas na ordenação.

Tamanho: 1 + t bytes

Sinônimos: NATIONAL CHAR (t) BINARY CHAR (t) BYTE

O mesmo que CHAR (t)BINARY.

DATE

Registros de tempo, entre 01/01/1000 e 31/12/9999, com precisão de dias (datas apenas).

Tamanho: 3 bytes Sinônimos: nenhum

DATETIME

Registros de tempo, entre 01/01/1000 00:00:00 e 31/12/9999 23:59:59, com precisão de segundos.

Tamanho: 8 bytes Sinônimos: nenhum

DEC (p, s)

O mesmo que DECIMAL (p, s).

DECIMAL (p, s)

Números armazenados como strings de dígitos, com ou sem sinal dependendo se declarados como signed ou unsigned, limitados aos valores máximos do tipo DOUBLE; p é o tamanho total do número; s é o número de casas decimais. Para números negativos, o sinal conta como um dígito.

Tamanho: p +2 bytes se s > 0; p +1 bytes se s = 0; s +2 bytes, se p < s Sinônimos: DEC (p, s), NUMERIC (p, s)

DOUBLE

Números reais, com precisão dupla, entre –1,7976931348623157 × 10308 e -

2,2250738585072014 × 10-308, 0 e entre 2,2250738585072014 × 10-308 e 1,7976931348623157 × 10308, se declarado como signed; se for declarado com unsigned, os valores negativos são desabilitados.

Tamanho: 8 bytes

Sinônimos: DOUBLE PRECISION, REAL DOUBLE PRECISION

O mesmo que DOUBLE.

ENUM (e1,...,en)

Strings que podem assumir somente um dos até 65.535 valores enumerados, o valor nulo ou o valor de erro.

Tamanho: 1 ou 2 bytes, dependendo do número de elementos Sinônimos: nenhum

FLOAT

(18)

Números reais com precisão simples entre -3,402823466 × 1038 e -1,175494351 × 10-38, 0 e entre 1,175494351 × 10-38 e 3,402823466 × 1038, se declarado como signed; se for declarado como unsigned, os valores negativos são desabilitados.

Tamanho: 4 bytes

Sinônimos: DOUBLE PRECISION, REAL FLOAT (p [,s])

O mesmo que FLOAT se p ≤ 24; o mesmo que DOUBLE se 25 ≤ p ≤ 53. O argumento s indica o número de casas decimais.

Tamanho: 4 ou 8 bytes, dependendo de p.

Sinônimos: nenhum

INT

Números inteiros: entre –2.147.483.648 e 2.147.483.647, se declarado como signed; entre 0 e 4.294.967.295, se declarado como unsigned.

Tamanho: 4 bytes Sinônimos: INTEGER INTEGER

O mesmo que INT.

LONGBLOB

Formato livre, com até 4.294.967.295 caracteres; ordenado com sensibilidade para maiúsculas e minúsculas.

Tamanho: comprimento do campo + 4 bytes Sinônimos: nenhum

LONGTEXT

Dados de formato livre, com até 4.294.967.295 caracteres; ordenado sem sensibilidade para maiúsculas e minúsculas.

Tamanho: comprimento do campo + 4 bytes Sinônimos: nenhum

MEDIUMBLOB

Formato livre, com até 16.777.215 caracteres; ordenado com sensibilidade para maiúsculas e minúsculas.

Tamanho: comprimento do campo + 3 bytes Sinônimos: nenhum

MEDIUMINT

Números inteiros: entre –8.388.608 e 8.388.607, se declarado como signed; entre 0 e 16.777.215, se declarado como unsigned.

Tamanho: 3 bytes Sinônimos: nenhum

MEDIUMTEXT

Dados de formato livre, com até 16.777.215 caracteres; ordenado sem sensibilidade para maiúsculas e minúsculas.

Tamanho: comprimento do campo + 3 bytes Sinônimos: nenhum

NATIONAL CHAR (t)

O mesmo que CHAR (t).

NATIONAL CHAR (t) BINARY

O mesmo que CHAR (t) BINARY.

NUMERIC (p, s)

O mesmo que DECIMAL (p, s).

REAL

O mesmo que DOUBLE. Se o MySQL estiver rodando sob a opção --ANSI ou com a opção --sql- mode=REAL_AS_FLOAT, então REAL é o mesmo que FLOAT.

SET (e1,...,en)

(19)

Strings que podem assumir qualquer combinação de um ou mais dos até 64 valores enumerados.

Tamanho: de 1 a 8 bytes, dependendo do número de elementos Sinônimos: nenhum

SMALLINT

Números inteiros: entre –32.768 e 32.767, se declarado como signed; entre 0 e 65.535, se declarado como unsigned.

Tamanho: 2 bytes Sinônimos: nenhum

TEXT

Dados de formato livre, com até 65.535 caracteres; ordenado sem sensibilidade para maiúsculas e minúsculas.

Tamanho: comprimento do campo + 2 bytes Sinônimos: nenhum

TIME

Registros de tempo, compostos apenas de horas, minutos e segundos, entre -838:59:59 e 838:59:59, com precisão de segundos.

Tamanho: 3 bytes Sinônimos: nenhum

TIMESTAMP (t)

Registros de tempo, entre 01/01/1970 00:00:00 e o ano de 2037, com precisão de segundos.

Este tipo pode ser declarado associado a um tamanho t (que pode ser 14, 12, 10, 8, 6, 4 ou 2) que refere-se somente ao formato de edição do dados quando da sua apresentação, não fazendo diferença quanto à forma de armazenagem.

Tamanho: 4 bytes Sinônimos: nenhum

TINYBLOB

Formato livre, com até 255 caracteres; ordenado com sensibilidade para maiúsculas e minúsculas.

Tamanho: comprimento do campo + 1 byte Sinônimos: nenhum

TINYINT

Números inteiros: entre -128 e 127, se declarado como signed; entre 0 e 255, se declarado como unsigned.

Tamanho: 1 byte Sinônimos: BIT, BOOL TINYTEXT

Dados de formato livre, com até 255 caracteres; ordenado sem sensibilidade para maiúsculas e minúsculas.

Tamanho: comprimento do campo + 1 bytes Sinônimos: nenhum

VARCHAR (t)

Strings de caracteres, de tamanho variável até t, 0 ≤ t ≤ 255; quando armazenadas, espaços à direita são removidos; VARCHAR(0) é permitido, porém os únicos valores admissíveis são null e a string de zero caracteres.

Tamanho: t + 1 bytes

Sinônimos: NATIONAL VARCHAR (t) VARCHARACTER (t)

O mesmo que VARCHAR (t).

YEAR (4)

Registros de tempo, compostos apenas do ano, com quatro dígitos, entre 1901 e 2155.

Tamanho: 1 byte Sinônimos: nenhum

(20)

YEAR (2)

Registros de tempo, compostos apenas do ano, com dois dígitos, entre 1970 e 2069.

Tamanho: 1 byte Sinônimos: nenhum

7.4 TIPOS DE DADOS NO ORACLE

Alguns dos tipos listados a seguir são aceitos pelo Oracle a título de compatibilidade com tipos

ANSI, e podem ser utilizados na construção de tabelas, por exemplo. O sistema armazena o nome do tipo original mas converte-os para tipos nativos (built-in). Na relação completa de tipos, ao final desta seção, os tipos ANSI aparecem destacados dos tipos built-in.

QUADRO RESUMO DOS TIPOS DE DADOS NO ORACLE

Tipo Sinônimos NUMBER DEC, DECIMAL, DOUBLE PRECISION, FLOAT, FLOAT (p), INTEGER, INT,

NUMERIC, REAL, SMALLINT

Tempo DATE

CHAR CHARACTER

NCHAR NATIONAL CHARACTER, NATIONAL CHAR VARCHAR2 VARCHAR, CHARACTER VARYING, CHAR VARYING

NVARCHAR2 NATIONAL CHARACTER VARYING, NATIONAL CHAR VARYING, NCHAR VARYING

LONG CLOB String

NCLOB BLOB Binários RAW

LONG RAW BFILE ROWID Específicos

UROWID

TIPOS LÓGICOS NO ORACLE

O Oracle não disponibiliza tipos lógicos explícitos, como faz o Access, nem permite que expressões aritméticas sejam automaticamente convertidas para valores lógicos como o MySQL. Assim, atributos que têm o papel de registrar valores como “sim” ou “não” devem ser simulados, seja com tipos string ou numéricos.

Isso significa que uma consulta como

select * from inscricao where nota

que foi usada como exemplo no caso do Access e do MySQL não é aceita pelo Oracle. Efeito semelhante teria de ser obtido com uma consulta como

select *

(21)

from inscricao

where nota is not null and nota > 0

TIPOS NUMÉRICOS NO ORACLE

Oracle armazena números de ponto flutuante e de ponto fixo. Não há referências explícitas a números inteiros, que são armazenados como números de ponto fixo com zero casas decimais.

Os tipos INTEGER, INT e SMALLINT são tratados como NUMBER (38,0).

Os tipos DOUBLE, DOUBLE PRECISION e REAL, que permitem compatibilidade com tipos ANSI, são interpretados como NUMBER.

Oracle permite a especificação de escalas negativas, como explicado na seção 7.1. O efeito dessas definições é arredondar o número à esquerda da casa decimal.

TIPOS STRING NO ORACLE

Oracle oferece tipos para strings de tamanho fixo que manipulam conjuntos de caracteres monobyte ou multibyte (CHAR e NCHAR). Esses atributos são completados com brancos no final quando são armazenados com comprimentos menores que o tamanho especificado na declaração do tipo da coluna. Para strings de tamanho variável, os tipos VARCHAR2 e NVARCHAR2

suportam, igualmente, conjuntos de caracteres mono ou multibyte.

Strings longas podem ser armazenadas sob os tipos LONG, CLOB e NCLOB. Os dois últimos suportam conjuntos monobyte e multibyte, respectivamente, e têm função similar ao tipo LONG, porém com algumas vantagens, entre elas: uma tabela pode conter somente um atributo do tipo

LONG enquanto CBLOB e NCBLOB podem ocorrer mais de uma vez; LONG pode ir até 2 Gbytes e CBLOB

e NCBLOB até 4 Gbytes; CBLOB e NCBLOB estão sujeitos aos controles de transação do Oracle, o que facilita a manipulação de dados. Colunas dos tipos são armazenadas na base sob o código Unicode, de 2 bytes, e são convertidos para o conjunto de caracteres utilizados pelo usuário que os recupera. Atributos NCBLOB suportam caracteres com códigos de tamanho variável.

O tipo LONG é mantido para prover compatibilidade com versões anteriores. A Oracle recomenda fortemente que, em novas aplicações, sejam empregados os tipos xLOB para campos longos, binários ou strings.

Oracle suporta vários conjuntos de caracteres, que abrangem idiomas do mundo todo. A lista abaixo contém os conjuntos europeus. Além da categorização de mono e multibyte, os conjuntos marcados com a palavra ASCII são superconjuntos do código ASCII, sendo portanto passíveis de conversão Há ainda outros conjuntos, suportando idiomas asiáticos e do oriente médio.

LEGENDA>>>

US7ASCII ASCII 7-bit American Monobyte, ASCII

SF7ASCII ASCII 7-bit Finnish Monobyte

YUG7ASCII ASCII 7-bit Yugoslavian Monobyte

RU8BESTA BESTA 8-bit Latin/Cyrillic Monobyte, ASCII EL8GCOS7 Bull EBCDIC GCOS7 8-bit Greek Monobyte WE8GCOS7 Bull EBCDIC GCOS7 8-bit West European Monobyte

EL8DEC DEC 8-bit Latin/Greek Monobyte

TR7DEC DEC VT100 7-bit Turkish Monobyte

TR8DEC DEC 8-bit Turkish Monobyte, ASCII

TR8EBCDIC EBCDIC Code Page 1026 8-bit Turkish Monobyte TR8PC857 IBM-PC Code Page 857 8-bit Turkish Monobyte, ASCII TR8MACTURKISH MAC Client 8-bit Turkish Monobyte TR8MACTURKISHS MAC Server 8-bit Turkish Monobyte, ASCII TR8MSWIN1254 MS Windows Code Page 1254 8-bit Turkish Monobyte, ASCII WE8BS2000L5 Siemens EBCDIC.DF.L5 8-bit West European/Turkish Monobyte

WE8DEC DEC 8-bit West European Monobyte, ASCII

D7DEC DEC VT100 7-bit German Monobyte

(22)

F7DEC DEC VT100 7-bit French Monobyte

S7DEC DEC VT100 7-bit Swedish Monobyte

E7DEC DEC VT100 7-bit Spanish Monobyte

NDK7DEC DEC VT100 7-bit Norwegian/Danish Monobyte

I7DEC DEC VT100 7-bit Italian Monobyte

NL7DEC DEC VT100 7-bit Dutch Monobyte

CH7DEC DEC VT100 7-bit Swiss (German/French) Monobyte

SF7DEC DEC VT100 7-bit Finnish Monobyte

WE8DG DG 8-bit West European Monobyte, ASCII

WE8EBCDIC37C EBCDIC Code Page 37 8-bit Oracle/c Monobyte WE8EBCDIC37 EBCDIC Code Page 37 8-bit West European Monobyte D8EBCDIC273 EBCDIC Code Page 273/1 8-bit Austrian German Monobyte DK8EBCDIC277 EBCDIC Code Page 277/1 8-bit Danish Monobyte S8EBCDIC278 EBCDIC Code Page 278/1 8-bit Swedish Monobyte I8EBCDIC280 EBCDIC Code Page 280/1 8-bit Italian Monobyte WE8EBCDIC284 EBCDIC Code Page 284 8-bit Latin American/Spanish Monobyte WE8EBCDIC285 EBCDIC Code Page 285 8-bit West European Monobyte F8EBCDIC297 EBCDIC Code Page 297 8-bit French Monobyte WE8EBCDIC500C EBCDIC Code Page 500 8-bit Oracle/c Monobyte WE8EBCDIC500 EBCDIC Code Page 500 8-bit West European Monobyte EE8EBCDIC870 EBCDIC Code Page 870 8-bit East European Monobyte WE8EBCDIC871 EBCDIC Code Page 871 8-bit Icelandic Monobyte EL8EBCDIC875 EBCDIC Code Page 875 8-bit Greek Monobyte CL8EBCDIC1025 EBCDIC Code Page 1025 8-bit Cyrillic Monobyte CL8EBCDIC1025X EBCDIC Code Page 1025 (Modified) 8-bit Cyrillic Monobyte BLT8EBCDIC1112 EBCDIC Code Page 1112 8-bit Baltic Multilingual Monobyte D8EBCDIC1141 EBCDIC Code Page 1141 8-bit Austrian German Monobyte DK8EBCDIC1142 EBCDIC Code Page 1142 8-bit Danish Monobyte S8EBCDIC1143 EBCDIC Code Page 1143 8-bit Swedish Monobyte I8EBCDIC1144 EBCDIC Code Page 1144 8-bit Italian Monobyte F8EBCDIC1147 EBCDIC Code Page 1147 8-bit French Monobyte EEC8EUROASCI EEC Targon 35 ASCI West European/Greek Monobyte EEC8EUROPA3 EEC EUROPA3 8-bit West European/Greek Monobyte LA8PASSPORT German Government Printer 8-bit All-European Latin Monobyte, ASCII WE8HP HP LaserJet 8-bit West European Monobyte WE8ROMAN8 HP Roman8 8-bit West European Monobyte, ASCII

HU8CWI2 Hungarian 8-bit CWI-2 Monobyte, ASCII

HU8ABMOD Hungarian 8-bit Special AB Mod Monobyte, ASCII LV8RST104090 IBM-PC Alternative Code Page 8-bit Latvian (Latin/Cyrillic) Monobyte, ASCII US8PC437 IBM-PC Code Page 437 8-bit American Monobyte, ASCII BG8PC437S IBM-PC Code Page 437 8-bit (Bulgarian Modification) Monobyte, ASCII EL8PC437S IBM-PC Code Page 437 8-bit (Greek modification) Monobyte, ASCII EL8PC737 IBM-PC Code Page 737 8-bit Greek/Latin Monobyte LT8PC772 IBM-PC Code Page 772 8-bit Lithuanian (Latin/Cyrillic) Monobyte, ASCII LT8PC774 IBM-PC Code Page 774 8-bit Lithuanian (Latin) Monobyte, ASCII BLT8PC775 IBM-PC Code Page 775 8-bit Baltic Monobyte, ASCII WE8PC850 IBM-PC Code Page 850 8-bit West European Monobyte, ASCII EL8PC851 IBM-PC Code Page 851 8-bit Greek/Latin Monobyte, ASCII EE8PC852 IBM-PC Code Page 852 8-bit East European Monobyte, ASCII RU8PC855 IBM-PC Code Page 855 8-bit Latin/Cyrillic Monobyte, ASCII WE8PC858 IBM-PC Code Page 858 8-bit West European Monobyte, ASCII WE8PC860 IBM-PC Code Page 860 8-bit West European Monobyte. ASII IS8PC861 IBM-PC Code Page 861 8-bit Icelandic Monobyte, ASCII CDN8PC863 IBM-PC Code Page 863 8-bit Canadian French Monobyte, ASCII N8PC865 IBM-PC Code Page 865 8-bit Norwegian Monobyte. ASCII RU8PC866 IBM-PC Code Page 866 8-bit Latin/Cyrillic Monobyte, ASCII EL8PC869 IBM-PC Code Page 869 8-bit Greek/Latin Monobyte, ASCII LV8PC1117 IBM-PC Code Page 1117 8-bit Latvian Monobyte, ASCII

US8ICL ICL EBCDIC 8-bit American Monobyte

WE8ICL ICL EBCDIC 8-bit West European Monobyte WE8ISOICLUK ICL special version ISO8859-1 Monobyte WE8ISO8859P1 ISO 8859-1 West European Monobyte, ASCII EE8ISO8859P2 ISO 8859-2 East European Monobyte, ASCII SE8ISO8859P3 ISO 8859-3 South European Monobyte, ASCII NEE8ISO8859P4 ISO 8859-4 North and North-East European Monobyte, ASCII CL8ISO8859P5 ISO 8859-5 Latin/Cyrillic Monobyte, ASCII AR8ISO8859P6 ISO 8859-6 Latin/Arabic Monobyte, ASCII

Referências

Documentos relacionados

Diversidade sexual na escola: currículo e prática pedagógica / Alexandre Bortolini ; orientadora: Vera Maria Candau.. Candau,

Atente-se aos exercícios explicativos de cada conteúdo desenvolvido nas aulas on-line, bem como as atividades semanais e/ou quinzenais do caderno!!..

Pacientes com depleção (diminuição) de volume intravascular: Em pacientes com depleção acentuada de volume e/ou de sódio tais como, aqueles tratados com doses altas de

1. Nos termos da presente cláusula e da lei, Decreto-Lei n.º 84/2008, de 21 de Maio, que disciplina os aspetos relativos à venda de bens de consumo e das garantias a ela relativas,

a) velocidade da chuva em relação ao solo; b) velocidade da chuva em relação ao carro. A haste encontra-se ini- cialmente em repouso, com o seu comprimento ao longo da

Para isso em quatro experimentos foram avaliadas: as características fisiológicas de cultivares de mandioca após a aplicação do mesotrione; a interferência do

Corporate Control and Policies Page 12 UNIVERSIDAD DE PIURA UNIVERSIDAD DEL PACÍFICO UNIVERSIDAD ESAN UNIVERSIDAD NACIONAL AGRARIA LA MOLINA UNIVERSIDAD NACIONAL

II - A expressão “Peramanca” ou “Pêra-manca” está usada nas marcas “Vinho Pera-Manca Tinto” e “Vinho Pera-Manca” de forma fantasiosa (e não para designar a