sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server devuelve ??? cuando la columna se actualiza con caracteres tailandeses

No hay mucha información proporcionada en la pregunta. Todo lo que sabemos es:

  • La columna está usando la intercalación de Thai_CI_AS (al menos eso es lo que dice la pregunta)
  • Se están pasando caracteres tailandeses
  • Lo que se almacena en la columna es:???

Sin embargo, solo de eso podemos deducir dos cosas:

  1. La cadena entrante no es un NVARCHAR parámetro / variable, ni es un literal de cadena que tiene el prefijo "N" mayúscula,

    y

  2. La intercalación predeterminada para la base de datos en la que se ejecuta la consulta (no necesariamente la base de datos en la que existe la tabla) es no una colación tailandesa.

No sabemos si la columna de destino es VARCHAR o NVARCHAR , pero eso no importa si la intercalación de la columna es una intercalación tailandesa (ya que eso permitirá VARCHAR datos para contener caracteres tailandeses y NVARCHAR funcionaría independientemente).

Si cualquiera :

  • la cadena entrante usa un NVARCHAR parámetro (o si es una cadena literal, entonces prefije con una "N" mayúscula),

    o

  • la consulta se ejecutó en una base de datos que tiene una intercalación predeterminada tailandesa

entonces los caracteres tailandeses se almacenarían como se esperaba.

El ejemplo siguiente muestra este comportamiento. Uso un Carácter tailandés Khomut U+0E5B en una instancia que tiene un Korean_100_CS_AS_KS_WS_SC Intercalación predeterminada a nivel de instancia. La columna de destino tiene una Intercalación de Thai_CI_AS . Primero, mientras que la base de datos "actual" es una que no tiene una Intercalación predeterminada tailandesa, agrego el carácter dos veces:una vez con el prefijo "N" y una vez sin prefijo en el literal de la cadena:

USE [tempdb];
-- DROP TABLE #Thai;
CREATE TABLE #Thai (ID INT IDENTITY(1, 1), Col1 VARCHAR(50) COLLATE Thai_CI_AS);

-- In a DB with a non-Thai default Collation:
INSERT INTO #Thai (Col1) VALUES ('๛');
INSERT INTO #Thai (Col1) VALUES (N'๛');

A continuación, cambio a una base de datos que tenga una intercalación predeterminada tailandesa e inserte solo la cadena sin prefijo (no es necesario volver a probar la cadena con el prefijo "N"):

USE [other_db];

-- In a DB with a Thai default Collation:
INSERT INTO #Thai (Col1) VALUES ('๛');


SELECT * FROM #Thai;

El resultado es:

ID  Col1
1   ?
2   ๛
3   ๛

Como puede ver (el punto n.° a continuación se relaciona con el n.° de ID en los resultados anteriores):

  1. La cadena sin el prefijo "N", utilizada en una base de datos que utiliza una intercalación predeterminada no tailandesa, se tradujo a ?
  2. La cadena con el prefijo "N", también utilizada en una base de datos que usa una intercalación predeterminada no tailandesa, almacenó el valor correctamente
  3. La cadena sin el prefijo "N", utilizada en una base de datos que tiene una intercalación predeterminada tailandesa, almacenó el valor correctamente