SQL Server
Tipos de dados no SQL
Server
Tipos de dados básicos que o SQL Server fornece para o armazenamento de informações.
Uma boa análise do tipo de dado para cada campo (também referenciado como coluna da
tabela) pode ser extremamente vantajosa, tanto a nível de performance, escalabilidade,
modelagem e tamanho do banco de dados.
Antes de começar, vou mostrar como podemos criar uma tabela através da sintaxe básica da
instrução SQL CREATE TABLE:
CREATE TABLE table_name
(
nome_campo tipo_dado [[NOT] NULL] ,
nome_campo1 tipo_dado [[NOT] NULL] ,
nome_campo2 tipo_dado [[NOT] NULL] ,
nome_campo3 tipo_dado [[NOT] NULL] ,
...
)
A instrução CREATE TABLE possui mais opções, porém a sintaxe básica que eu apresentei
aqui está no padrão ANSI e pode ser utilizada para criar tabelas em outros bancos de dados
como o Oracle, MySQL, DB, etc. Um exemplo de criação de uma tabela com dois campos:
CREATE TABLE Exemplo1
(
codigo INT NOT NULL ,
nome CHAR(30) NULL
)
A tabela chamada Exemplo1 foi criada com dois campos: codigo, do tipo INT e nome do tipo
CHAR(30). Junto com o tipo de dados, devemos especificar se este campo permite ou não seu
preenchimento com NULO (nulabilidade), que quer dizer ausência de dados. Se não
especificarmos nada para o campo, por padrão o campo irá aceitar valores NULL.
Abaixo segue uma relação dos tipos de dados básicos do SQL Server, sendo que os tipos que
estiverem marcados com
* somente funcionam a partir do SQL Server 2000
TINYINT: Valores numéricos inteiros variando de 0 até 256
SMALLINT: Valores numéricos inteiros variando de –32.768 até 32.767
INT: Valores numéricos inteiros variando de -2.147.483.648 até 2.147.483.647
* BIGINT: Valores numéricos inteiros variando de –92.23.372.036.854.775.808 até
9.223.372.036.854.775.807
BIT: Somente pode assumir os valores 0 ou 1. Utilizado para armazenar valores lógicos.
DECIMAL(I,D) e NUMERIC(I,D): Armazenam valores numéricos inteiros com casas decimais
utilizando precisão. I deve ser substituído pela quantidade de dígitos total do número e D deve
ser substituído pela quantidade de dígitos da parte decimal (após a vírgula). DECIMAL e
NUMERIC possuem a mesma funcionalidade, porém DECIMAL faz parte do padrão ANSI e
NUMERIC é mantido por compatibilidade. Por exemplo, DECIMAL(8,2) armazena valores
numéricos decimais variando de – 999999,99 até 999999,99
Lembrando sempre que o SQL Server internamente armazena o separador decimal como
ponto (.) e o separador de milhar como vírgula (,). Essas configurações INDEPENDEM de
como o Windows está configurado no painel de controle e para DECIMAL E NUMERIC,
somente o separador decimal (.) é armazenado
SMALLMONEY: Valores numéricos decimais variando de -214.748,3648 até 214.748,3647
MONEY: Valores numéricos decimais variando de -922.337.203.685.477,5808 até
922.337.203.685.477,5807
REAL: Valores numéricos aproximados com precisão de ponto flutuante, indo de
-3.40E + 38 até 3.40E + 38
FLOAT: Valores numéricos aproximados com precisão de ponto flutuante, indo de
-1.79E + 308 até 1.79E + 308
SMALLDATETIME: Armazena hora e data variando de 1 de janeiro de 1900 até 6 de junho de
2079. A precisão de hora é armazenada até os segundos.
DATETIME: Armazena hora e data variando de 1 de janeiro de 1753 até 31 de Dezembro de
9999. A precisão de hora é armazenada até os centésimos de segundos.
CHAR(N): Armazena N caracteres fixos (até 8.000) no formato não Unicode. Se a quantidade
de caracteres armazenada no campo for menor que o tamanho total especificado em N, o resto
do campo é preenchido com espaços em branco.
VARCHAR(N): Armazena N caracteres (até 8.000) no formato não Unicode. Se a quantidade
de caracteres armazenada no campo for menor que o tamanho total especificado em N, o resto
do campo não é preenchido.
TEXT: Armazena caracteres (até 2.147.483.647) no formato não Unicode. Se a quantidade de
caracteres armazenada no campo for menor que 2.147.483.647, o resto do campo não é
preenchido. Procure não utilizar este tipo de dado diretamente, pois existem funções
específicas para trabalhar com este tipo de dado.
NCHAR(N): Armazena N caracteres fixos (até 4.000) no formato Unicode. Se a quantidade de
caracteres armazenada no campo for menor que o tamanho total especificado em N, o resto do
campo é preenchido com espaços em branco.
NVARCHAR(N): Armazena N caracteres (até 4.000) no formato Unicode. Se a quantidade de
caracteres armazenada no campo for menor que o tamanho total especificado em N, o resto do
campo não é preenchido.
NTEXT: Armazena caracteres (até 1.073.741.823) no formato Unicode. Se a quantidade de
caracteres armazenada no campo for menor que 1.073.741.823, o resto do campo não é
preenchido. Procure não utilizar este tipo de dado diretamente, pois existem funções
específicas para trabalhar com este tipo de dado.
BINARY(N): Armazena N (até 8.000 bytes) dados no formato binário. Se a quantidade de
dados binários armazenados no campo for menor que o tamanho total especificado em N, o
resto do campo é preenchido com espaços em branco. Procure não utilizar este tipo de dado
diretamente, pois existem funções específicas para trabalhar com este tipo de dado.
VARBINARY(N): Armazena N (até 8.000 bytes) dados no formato binário. Se a quantidade de
dados binários armazenados no campo for menor que o tamanho total especificado em N, o
resto do campo não é preenchido. Procure não utilizar este tipo de dado diretamente, pois
existem funções específicas para trabalhar com este tipo de dado.
IMAGE: Armazena dados no formato binário (até 2,147,483,647 bytes). Se a quantidade de
dados binários armazenados no campo for menor que o tamanho total especificado em N, o
resto do campo não é preenchido. Procure não utilizar este tipo de dado diretamente, pois
existem funções específicas para trabalhar com este tipo de dado.
CURSOR: Armazena uma referência (ponteiro) de um cursor do SQL Server. Não pode ser
utilizado como um tipo de dado de uma tabela, somente em declarações de variáveis.
* SQL_VARIANT: Permite o armazenamento de todos os tipos de dados em uma mesmo
campo de uma tabela com exceção dos tipos TEXT, NTEXT, TIMESTAMP e SQL_VARIANT
* TABLE: Armazena um conteúdo do resultado de uma instrução SELECT em uma variável de
memória do SQL Server. Não pode ser utilizado como um tipo de dado de uma tabela, somente
para declarações em variáveis. Este tipo de dados pode servir para suprir a necessidade de
criação de arrays e matrizes no SQL Server.
TIMESTAMP: Este tipo de dado permite a geração automática de uma valor binário para um
campo de uma tabela do SQL Server. Cada tabela pode possuir somente um campo com o tipo
de dadoTIMESTAMP. Para o tipo de dado TIMESTAMP, devemos ou criar um DEFAULT para
seu valor padrão ou passar NULL para este campo em uma instrução INSERT, pois o banco de
dados automaticamente gerará um valor binário para esta coluna.
UNIQUEIDENTIFIER: Este tipo de dado deve ser utilizado para a criação de um identificar
global para uma coluna de uma tabela. Também podemos possuir somente um campo como
tipo UNIQUEIDENTIFIER por tabela. Este identificador deve ser utilizado quando temos
certeza absoluta que nenhum valor para o campo deve ser repetido. Para alimentar o conteúdo
deste campo, devemos preferencialmente utilizar a função NEWID() que retornar um
identificador no formato desde tipo.
Além destes tipos de dados básicos do SQL Server podemos criar colunas calculadas,
baseadas em valores de outras colunas da mesma tabela. Por exemplo:
CREATE TABLE ITENS_PED
(
PED_COD INT NOT NULL,
PED_PRC NUMERIC(6,2) NOT NULL,
PED_QTD TINYINT NOT NULL ,
PED_TOT AS PED_QTD * PED_PRC
)
Neste exemplo, a coluna calculada se chama PED_TOT e seu conteúdo é gerado através da
multiplicação dos campos PED_QTD e PED_PRC. Para inserir ou alterar um registro não
devemos passar o conteúdo do campo calculado. A instrução INSERT abaixo:
INSERT INTO ITENS_PED VALUES(1,5.2,2)
Gravará o seguinte registro:
PED_COD PED_PRC PED_QTD PED_TOT
------------- ------------- ------------- ------------1 5.20 2 10.40
Devemos ter cuidado com as colunas calculadas, pois o seu valor não está fisicamente
armazenada e sim gerada no momento em que o dado é requisitado ao banco de dados.
Também devemos tomar cuidado com criação de índices em colunas computadas. A
expressão utilizada na coluna computada (no nosso exemplo *) não pode ser uma sub-query.
Para a conversão entre os diversos tipos de dados , quando possível, existem duas funções:
CAST() e CONVERT(). Exemplos:
-- CONVERTE UM INT PARA UM NUMERIC(10,2)
SELECT CONVERT(NUMERIC(10,2),3)
SELECT CAST ( 3 AS NUMERIC(10,2) )
-- CONVERTE UM NUMERIC(10,2) PARA UM INT
SELECT CONVERT(INT,5.45)
SELECT CAST ( 5.45 AS INT)
-- CONVERTE UM VARCHAR PARA NUMERIC(10,2)
SELECT CONVERT(NUMERIC(10,2),'5.45')
SELECT CAST ( '5.45' AS NUMERIC(10,2))
-- CONVERTE UM INT PARA UM CHAR(5)
SELECT CONVERT(CHAR(5) ,10325)
SELECT CAST ( 10325 AS CHAR(5))
CONVERT() e CAST() possuem quase a mesma funcionalidade: CONVERT() permite utilizar
uma estilo de formatação para data. Sempre que possível procure utilizar CAST() pois esta
função segue o padrão ANSI.
Consultando o Book On-Line podemos observar qual tipo de dados pode ser convertido para
qual tipo e ainda podemos descobrir quando o SQL Server faz conversão automática de dados
entre os tipos envolvidos em uma expressão.
Download

Tipos de dados no SQL Server