Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server restituisce??? quando la colonna viene aggiornata con caratteri tailandesi

Non ci sono molte informazioni fornite nella domanda. Tutto quello che sappiamo è:

  • La colonna sta usando le regole di confronto di Thai_CI_AS (almeno che fosse sembra che la domanda stia affermando)
  • I caratteri tailandesi vengono trasmessi
  • Quello che è memorizzato nella colonna è:???

Tuttavia, da questo solo possiamo dedurre due cose:

  1. La stringa in entrata non è né un NVARCHAR parametro / variabile, né è una stringa letterale preceduta da una "N" maiuscola,

    e

  2. Le regole di confronto predefinite per il database in cui viene eseguita la query (non necessariamente il database in cui esiste la tabella) non una raccolta tailandese.

Non sappiamo se la colonna di destinazione è VARCHAR o NVARCHAR , ma non importa se il confronto della colonna è un confronto tailandese (poiché ciò consentirà VARCHAR dati per contenere caratteri tailandesi e NVARCHAR funzionerebbe a prescindere).

Se uno dei due :

  • la stringa in entrata usa un NVARCHAR parametro (o se stringa letterale, prefisso con una "N" maiuscola),

    o

  • la query è stata eseguita in un DB che ha un confronto predefinito tailandese

quindi i caratteri tailandesi verrebbero archiviati come previsto.

Nell'esempio seguente viene illustrato questo comportamento. Uso un personaggio tailandese Khomut U+0E5B su un'istanza con un Korean_100_CS_AS_KS_WS_SC Fascicolazione predefinita a livello di istanza. La colonna di destinazione ha un confronto di Thai_CI_AS . Primo, mentre il DB "corrente" è uno che non ho una Fascicolazione predefinita tailandese, aggiungo il carattere due volte:una volta preceduto da "N" e una volta senza prefisso sulla stringa letterale:

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'๛');

Successivamente, passo a un DB che fa avere una Fascicolazione predefinita tailandese e inserire solo la stringa senza prefisso (non è necessario testare nuovamente la stringa con prefisso "N"):

USE [other_db];

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


SELECT * FROM #Thai;

Il risultato è:

ID  Col1
1   ?
2   ๛
3   ๛

Come puoi vedere (il punto # sotto si riferisce all'ID # nei risultati sopra):

  1. La stringa con prefisso non "N", utilizzata in un database che utilizza un confronto predefinito non tailandese, è stata tradotta in ?
  2. La stringa con il prefisso "N", utilizzata anche in un DB che utilizza un confronto predefinito non tailandese, ha memorizzato il valore correttamente
  3. La stringa con prefisso non "N", utilizzata in un DB che ha un confronto predefinito tailandese, ha memorizzato il valore correttamente