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