Por: Sergey Gigoyan | Actualizado: 2020-06-29 | Comentários | Related: Mais > Tipos de Dados
Problema
No desenvolvimento de bases de dados, há alguns casos especiais em que é necessário trabalhar com o tipo de dados booleanos. Este é um tipo de dados que permite apenas dois valores possíveis “Verdadeiro” ou “Falso”. Definitivamente, se uma variável ou coluna só pode ter dois valores possíveis, será mais fácil e lógico definir o seu tipo como Booleano. Assim, o SQL Server tem Booleano ou um tipo de dados semelhante? No SQL Server, existe um tipo de nodata chamado Booleano. No entanto, existe um tipo de dados chamado bit que pode ser utilizado para armazenar valores booleanos. Neste artigo, vamos introduzir e explorar o tipo de dados bit do SQL Server.
Solution
SQL Server bit data type é um tipo de dados inteiro que só pode tomar um destes valores: 0, 1, NULL. No que diz respeito ao armazenamento, se houver menos de 9 colunas de dados de bits na tabela, estes são armazenados como 1 byte. Se houver 9 a 16 dessas colunas, elas consomem 2 bytes e assim por diante. Assim, o SQL Server optimiza o armazenamento de colunas do tipo de dados de bits. Além disso, os valores de string TRUE andFALSE podem ser convertidos em 1 e 0 correspondentes aos valores de bit.
Faatures
Agora, vamos explorar as características e especificações do tipo de dados de bit. Em primeiro lugar, como é mencionado acima, as cordas ‘TRUE’ e ‘FALSE’ são convertidas em 1 e 0. Este comportamento é ilustrado no exemplo seguinte:
DECLARE @isUsed BITDECLARE @isUsedStr NCHAR(5) SELECT @isUsed AS BitType, @isUsedStr AS String --TRUE is converted to 1SET @isUsedStr='TRUE' SET @ SELECT @isUsed AS BitType, @isUsedStr AS String --FALSE is converted to 0SET @isUsedStr='FALSE' SET @ SELECT @isUsed AS BitType, @isUsedStr AS String --Assigning any other string value to a bit variable causes an errorSET @isUsedStr='YES' SET @ SELECT @isUsed AS BitType, @isUsedStr AS String
No código acima, declaramos às variáveis – um dos bits e outro do tipo de dados da cadeia. Em seguida, atribuímos a string a uma variável do tipo de dados de bit. Como podemos ver, os valores ‘TRUE’ e ‘FALSE’ são convertidos com sucesso para os valores correspondentes (1 e 0) do tipo de dados de bit:
Atribuir qualquer outra string a uma variável de bit, contudo, causa um erro. Na ourexample, atribuímos ‘SIM’ a uma variável de bit e recebemos um erro:
Segundo, é importante mencionar que a atribuição de qualquer valor não zero a um tipo de bitdata converte-o para 1. No exemplo seguinte, atribuímos integradores positivos e negativos a uma variável do tipo de dados de bit:
DECLARE @isUsed BIT SELECT @isUsed AS BitType --Assigning any nonzero value converts it to 1SET @isUsed=9 SELECT @isUsed AS BitType --Assigning any nonzero value converts it to 1SET @isUsed=-100 SELECT @isUsed AS BitType
O resultado mostra que em ambos os casos, o valor da variável de bit é 1:
Vantagens do tipo de dados bit do servidorSQL
Como é mencionado acima, se tivermos menos de 9 colunas do tipo de dados bit na nossa tabela, elas são armazenadas como um byte. Portanto, a questão pode surgir porquê usar o bit em vez de char(1) ou tinynint se temos apenas uma coluna na tabela, aceitando apenas valores booleanos? Bem, vamos criar um ambiente de teste e ver o seguinte exemplo:
USE masterGO CREATE DATABASE TestDBGO USE TestDBGO CREATE TABLE .( NOT NULL PRIMARY KEY, (1) NULL, NULL, )GO
Criámos a base de dados TestDB e a tabela de amostras que armazena os resultados dos testes médicos dos pacientes. Assume-se, que o sexo pode ser apenas ‘Masculino’, ‘Feminino’, ‘Desconhecido’, ‘Indefinido’ ou ‘Outro’. Para os dois primeiros casos, utilizaremos ‘M’ e ‘F’ correspondentemente e para os últimos três casos, utilizaremos ‘NULL’. Para facilitar o nosso exemplo, presume-se também que os resultados dos testes podem ser positivos ou negativos (NULL será considerado como desconhecido). Os tipos de dados (char(1) e tinyint) escolhidos na tabela de definição, contudo, não são suficientes para implementar esta lógica. Temos de garantir que as colunas mencionadas não possam aceitar outros valores. Portanto, precisamos de criar checkconstraints:
USE GO --Adding check constraintsALTER TABLE . WITH CHECK ADD CONSTRAINT CHECK ((='M' OR ='F'))GO ALTER TABLE . CHECK CONSTRAINT GO ALTER TABLE . WITH CHECK ADD CONSTRAINT CHECK ((=(1) OR =(0)))GO
Em contraste, se utilizarmos o tipo de dados de bit para as colunas Género e Teste1Resultado, não precisamos de criar restrições de verificação:
USE TestDBGO DROP TABLE .GO CREATE TABLE .( NOT NULL PRIMARY KEY, NULL, NULL)GO
Para a coluna Género, podemos considerar 1 como masculino, por exemplo, 0 como feminino e NULL como desconhecido, indefinido ou outro. Em relação ao Resultado do Teste1, podemos considerar 1 como positivo e 0 como negativo.
Em termos de optimização de armazenamento, a principal vantagem é que se tivermos várias colunas booleanas, utilizando o tipo de bit podemos reduzir significativamente o espaço utilizado. Como exemplo simples, podemos utilizar uma tabela que armazena os vários resultados médicos dos pacientes (que são positivos ou negativos):
USE TestDBGO DROP TABLE .GO CREATE TABLE .( NOT NULL PRIMARY KEY, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)GO
Aí temos 8 colunas do tipo de dados bit e, portanto, é utilizado 1 byte para obter os valores. Se, em vez disso, utilizássemos o minúsculo ou char(1), seria utilizado 1 byte para cada um deles.
Podemos também obter benefícios da utilização do tipo de dados de bit em funções ou procedimentos armazenados que aceitam ou devolvem valores booleanos. Vamos supor que precisamos de uma função que verifique se um paciente é ou não testado. Obviamente, a função retornará VERDADEIRO ou FALSO. Assim, podemos usar o tipo de dados bit como um tipo de valor de retorno:
USE TestDBGO CREATE FUNCTION isPatientTested( @PatientID INT)RETURNS bitASBEGIN IF EXISTS (SELECT PatientID FROM PatientTestResults WHERE ) RETURN 1 RETURN 0 ENDGONow, we can easily call this boolean function:USE TestDBGO IF (dbo.isPatientTested(1)=1) PRINT 'The patient is tested'ELSE PRINT 'The patient is not tested'
Podemos ver que o paciente não é testado porque não existe um registo para o paciente com PatientID=1:
Conclusion
Em conclusão, o tipo de dados bit pode ser bastante útil se as colunas ou variáveis aceitarem apenas dois valores (mais NULL). Nestes casos, a utilização do tipo de bits em vez do tipo de string ou dos tipos de dados de cor minúscula pode tornar o código mais lógico e compacto. Além disso, como o SQL Server optimiza o armazenamento de colunas de bits, a utilização deste tipo de armazenamento pode ser economicamente vantajosa, particularmente se tivermos mais de 8 colunas de tipos de dados de bits na tabela.
Passos seguintes
Para encontrar mais informações sobre o tópico discutido, por favor siga os links abaixo:
- https://docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql?view=sql-server-ver15
- https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-ver15
Última Actualização: 2020-06-29
h5>Sobre o autor
Ver todas as minhas dicas
ul>>li>Mais Dicas de Desenvolvimento de Base de Dados…
br