Sidebar

Seguramente se han encontrado con scripts que contienen una N como prefijo.

La N significa National language character set y lo que esto nos esta diciendo es que se trata de datos unicode. Esto significa que se están pasando datos del tipo NCHAR, NVARCHAR o NTEXT, que son distintos a los CHAR, VARHCAR o TEXT.
Los datos unicode generalmente son utilizados en aplicaciones que están diseñandas para utilizar diferentes tipos de caracteres como sería los del lenguage Chino. Si en nuestra base de datos contamos con tablas que tengas estos tipos de datos es importante que todas las sentencias sobre estas tablas contengan este prefijo.

Veamos un ejemplo de como puede afectar en nuestras aplicaciones

DECLARE @n NVARCHAR(10)
SET @n = 'ā'
PRINT @n 
SET @n = N'ā' 
PRINT @n

Veamos los resultados

a
ā

El primer print no tiene el prefijo N, y cuando lo imprimimos podemos ver que el caracter cambia, debemos de tener mucho cuidado con esto porque podemos estar perdiendo datos.
En el segundo print si se esta guardando correctamente el caracter.

Otra cosa que debemos saber sobre los caracteres unicode es en el performance.

Ejecuten el siguiente ejemplo con el plan de ejecución encendido.

USE tempdb 
GO

CREATE TABLE a 
( 
b VARCHAR(3), 
c NVARCHAR(3) 
)

CREATE INDEX b ON a(b) 
CREATE INDEX c ON a(c) 
GO 

SET NOCOUNT ON
INSERT a SELECT 'foo', N'foo'
INSERT a SELECT 'bar', N'bar'

DECLARE 
@b VARCHAR(3), 
@c NVARCHAR(3)
SELECT 
@b = 'foo', 
@c = N'foo'

SELECT * FROM a WHERE b = @b 
SELECT * FROM a WHERE b = @c 
SELECT * FROM a WHERE c = @b 
SELECT * FROM a WHERE c = @c 
SELECT * FROM a WHERE b LIKE @b 
SELECT * FROM a WHERE b LIKE @c 
SELECT * FROM a WHERE c LIKE @b
SELECT * FROM a WHERE c LIKE @c 

DROP TABLE a

Estos son los resultados

VARCHAR = VARCHAR 4.48%
VARCHAR = NVARCHAR 13.31%
NVARCHAR = VARCHAR 4.48%
NVARCHAR = NVARCHAR 4.48%
VARCHAR LIKE VARCHAR 4.48%
VARCHAR LIKE NVARCHAR 13.31%
NVARCHAR LIKE VARCHAR 4.48%
NVARCHAR LIKE NVARCHAR 4.48%

Cuando hacemos ciertas conversiones implicitas, eso puede costarle mucho trabajo a SQL Server como vemos en la tabla anterior. El problema es que ciertas conversiones implicitas pueden causar un table scan en lugar de un index scan y en tablas muy grandes esto puede afectar en gran medida al performance. La recomendación aqui es usar siempre el mismo tipo de dato para hacer comparaciones.


Tips BD