2014/04/10

Otro post sobre diferencias entre CHAR, VARCHAR, NCHAR, NVARCHAR

Buen día, algunas diferencias entre los tipos CHAR, NCHAR, VARCHAR y NVARCHAR deben ser tomados en cuenta al momento de utilizarlas para saber cual es la más adecuada o la que cumple con los requerimientos.

CHAR tipo de dato para almacenar cadenas de texto NO UNICODE( más tarde explico esto) de longitud fija, que quiere decir esto ultimo, si se define una variable o columna de longitud 5 aun cuando solo se ocupen 3 caracteres, el tamaño en memoria será de 5 bytes. Ejemplo:
DECLARE @varTipoChar AS CHAR(5) = 'abc'

SELECT @varTipoChar AS [variableTipoChar]
, LEN( @varTipoChar ) AS [longitudCadena]
, DATALENGTH( @varTipoChar ) AS [espacioEnMemoria]
, ascii( SUBSTRING( @varTipoChar , 4,1 ) ) AS [asciiCaracter]
, REPLACE( @varTipoChar, char(32) , '_' ) AS [caracterReemplazado]
Como podemos observar, la cadena ingresada es abc, la cual tiene como longitud 3 ocupando un espacio de 5 bytes. Los dos valores siguientes son para demostrarles que aun cuando hayamos insertado una cadena de longitud 3 en una variable definida como 5, el motor reemplaza los valores restantes por un espacio en blanco, donde su código ascii es 32, si reemplazamos este valor podemos observar que el resto de la variable tiene este caracter.

VARCHAR también sirve para almacenar cadenas de texto NO UNICODE pero de longitud variable, se los muestro con un ejemplo:
DECLARE @varTipoVarChar AS VARCHAR(5) = 'abc'

SELECT @varTipoVarChar AS [variableTipoVarChar]
, LEN( @varTipoVarChar ) AS [longitudCadena]
, DATALENGTH( @varTipoVarChar ) AS [espacioEnMemoria]
, ascii( SUBSTRING( @varTipoVarChar , 4,1 ) ) AS [asciiCaracter]
, REPLACE( @varTipoVarChar, char(32) , '_' ) AS [caracterReemplazado]
La cadena ingresada así como la longitud siguen siendo las mismas, sin embargo el espacio en memoria no, si ingresamos una cadena de longitud 3, este es el espacio utilizado en disco, aun cuando la variable o columna sea de 5; Por lo tanto, no existen más caracteres después de la cadena, es por ello que NULL aparece en la columna asciiCaracter y la columna caracterReemplazado no sufre ningún cambio.

NCHAR es capaz de almacenar cadenas de texto UNICODE de longitud fija, es decir que es capaz de almacenar y visualizar caracteres de otros idiomas, como por ejemplo el chino o el japonés. Cada carácter de tipo UNICODE ocupa 2 bytes, a diferencia de NO UNICODE que solo ocupa 1 byte.
DECLARE @varTipoNChar  AS NCHAR(5) = N'我們製'
DECLARE @varTipoNChar2 AS NCHAR(5) = '我們製'

SELECT
@varTipoNChar AS [variableTipoNChar]
, @varTipoNChar2 AS [variableTipoNChar2] 
, LEN( @varTipoNChar ) AS [longitudCadena]
, DATALENGTH( @varTipoNChar ) AS [espacioEnMemoria]
, ascii( SUBSTRING( @varTipoNChar , 4,1 ) ) AS [asciiCaracter]
, REPLACE( @varTipoNChar, char(32) , '_' ) AS [caracterReemplazado]
La cadena ingresada es 我們製de longitud 3, que además ocupa un espacio en disco de 10 bytes, esto por ser de tipo NCHAR permite el ingreso de caracteres UNICODE, donde cada carácter ocupa 2 bytes y además es de longitud fija, por lo que 2x5=10 bytes. Además es necesario resaltar que en la segunda columna estoy intentando ingresar caracteres UNICODE a una variable del mismo tipo, sin embargo no se pueden visualizar debido a que es necesario el prefijo N antes de la cadena.
NVARCHAR permite almacenar cadenas de texto UNICODE de longitud variable:
DECLARE @varTipoNVarChar  AS NVARCHAR(5) = N'我們製'
DECLARE @varTipoNVarChar2 AS NVARCHAR(5) = '我們製'

SELECT
@varTipoNVarChar AS [variableTipoNVarChar]
, @varTipoNVarChar2 AS [variableTipoNVarChar2] 
, LEN( @varTipoNVarChar ) AS [longitudCadena]
, DATALENGTH( @varTipoNVarChar ) AS [espacioEnMemoria]
, ascii( SUBSTRING( @varTipoNVarChar , 4,1 ) ) AS [asciiCaracter]
, REPLACE( @varTipoNVarChar, char(32) , '_' ) AS [caracterReemplazado]
De igual manera, en la primera columna tenemos la variable tipo NVARCHAR( @varTipoVarChar ), después otra variable NVARCHAR( @varTipoNVarChar2 ) donde se ingresó de manera incorrecta una cadena NVARCHAR, luego la longitud de la cadena de la variable @varTipoNVarChar así como el espacio en memoria( 2x3=6 bytes ), como es de longitud variable no hay caracteres después de la cadena ingresada.

Que tipo de dato es el más adecuado? El que se adapte a las necesidades teniendo en cuenta el espacio utilizado en memoria, si la longitud es fija o variable así como también si es necesario el ingreso de caracteres UNICODE o NO UNICODE.

SALUDOS.
COMPARTE ESTA INFORMACION SI TE PARECIO INTERESANTE

0 comentarios:

Publicar un comentario