2010-04-26 9 views
10

Digamos que tengo una tabla que tiene un campo varchar. Si hago una inserción como esta:¿Hay algún inconveniente en poner N en frente de las cadenas en las secuencias de comandos? ¿Se considera una "mejor práctica"?

INSERT MyTable 
SELECT N'the string goes here' 

¿Hay alguna diferencia fundamental entre eso y:

INSERT MyTable 
SELECT 'the string goes here' 

Mi entendimiento es que usted sólo tiene un problema si la cadena contiene un carácter Unicode y la columna de destino no era unicode Aparte de eso, SQL lo trata bien y convierte la cadena con el N'' en un campo varchar (ignora básicamente el N).

Tenía la impresión de que N frente a las cadenas era una buena práctica, pero no puedo encontrar ninguna discusión que considere definitiva.

Respuesta

3

Respuesta corta: bien para las secuencias de comandos, malo para el código de producción.

No se considera una buena práctica. Hay una desventaja, crea un golpe de rendimiento minúsculo ya que los caracteres de 2 bytes se convierten en caracteres de 1 byte.

Si no sabe a dónde va la inserción, o no sabe de dónde proviene el texto de origen (supongamos que es una utilidad de inserción de datos de uso general que genera instrucciones de inserción para un destino desconocido, por ejemplo al exportar datos), N'foo 'podría ser el estilo de codificación más defensivo.

Por lo tanto, la desventaja es pequeña y la ventaja es que el código de secuencia de comandos es mucho más adaptable a los cambios en la estructura de la base de datos. Probablemente por eso lo ve en scripts de inserción de datos masivos.

Sin embargo, si el código en cuestión es algo para ser reutilizado en un entorno donde se preocupe por la calidad del código, no debe usar N'the string' porque está agregando una conversión donde ninguna es necesaria.

+1

Ah, a la defensiva, me gusta ese término aquí. +1 – jcollum

+0

Creo que esto, combinado con el de arriba es la respuesta. Creo que editaré esto y lo llamaré la respuesta. – jcollum

+0

@jcollum: No se trata solo del rendimiento de una conversión. Está indicando la semántica incorrecta para los futuros mantenedores. Es un poco como escribir predicados como 'WHERE SomeCol = '1'', como si fuera una columna' varchar', cuando en realidad es una columna 'int'. Puede funcionar, pero eso no lo hace menos incorrecto, y puede conducir a sutiles errores relacionados con la intercalación en el futuro a medida que se cambia el guión. El código generado obviamente no está sujeto a un estándar de calidad tan alto como el código escrito; lo mismo es generalmente cierto para cualquier gen de código, intente ver el código de diseñador detrás de Windows Form. – Aaronaught

6

Debe prefijar cadenas con N cuando están destinadas a una columna o parámetro nvarchar(...). Si están destinados a una columna o parámetro varchar(...), omítenlo; de lo contrario, terminan con una conversión innecesaria.

Definitivamente no es una "mejor práctica" pegar N delante de cada cuerda, independientemente de para qué sirve.

+1

Pero si coloca la N al frente, realmente no necesita saber cuál es el tipo de datos de la columna de destino. Preocuparse por la conversión adicional se siente como una micro-optimización. – jcollum

+2

@jcollum: El hecho es que la mejor práctica es usar lo que es realmente correcto. Alguien puede ver su consulta y concluir de manera incorrecta que la columna admite caracteres Unicode cuando en realidad no lo hace. – Aaronaught

+0

Lo que me pregunto es por qué tantas herramientas colocan N delante de las cadenas, independientemente del tipo de destino. – jcollum

0

De INSERT (Transact-SQL)

Al hacer referencia a los tipos de datos de caracteres Unicode nchar, nvarchar y ntext 'expresión' debe tener el prefijo la letra mayúscula 'N'.

también tienen una lectura en Why do some SQL strings have an 'N' prefix?

Y

Server-Side Programming with Unicode

constantes de cadena Unicode que aparecen de código que se ejecuta en el servidor, tales como en procedimientos almacenados y disparadores, debe estar precedido por la letra mayúscula N. Esto es cierto incluso si la columna al que se hace referencia ya está definido como Unicode. Sin el prefijo N, la cadena se convierte a la página de códigos predeterminada de la base de datos. Esto puede no reconocer ciertos caracteres.

+0

No responde la pregunta. No estaba preguntando por qué está allí. Me preguntaba si hay un inconveniente o si es una buena práctica tenerlo ahí independientemente. – jcollum

+0

No, no lo sería, si no se requiere ... –

Cuestiones relacionadas