Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server gibt ??? wenn die Spalte mit thailändischen Zeichen aktualisiert wird

In der Frage sind nicht viele Informationen enthalten. Wir wissen nur:

  • Spalte verwendet Sortierung von Thai_CI_AS (Zumindest klingt es so, als würde die Frage sagen)
  • Thailändische Zeichen werden übergeben
  • Was in der Spalte gespeichert ist, ist:???

Allein daraus können wir jedoch zwei Dinge ableiten:

  1. Der eingehende String ist weder ein NVARCHAR Parameter / Variable, noch ist es ein String-Literal, dem ein großes "N" vorangestellt ist,

    und

  2. Die Standardsortierung für die DB, in der die Abfrage ausgeführt wird (nicht unbedingt die DB, in der die Tabelle vorhanden ist), ist nicht eine thailändische Sortierung.

Wir wissen nicht, ob die Zielspalte VARCHAR ist oder NVARCHAR , aber das spielt keine Rolle, wenn die Sortierung der Spalte eine thailändische Sortierung ist (da dies VARCHAR zulässt Daten für thailändische Zeichen und NVARCHAR würde trotzdem funktionieren).

Wenn entweder :

  • die eingehende Zeichenfolge verwendet ein NVARCHAR Parameter (oder wenn String-Literal, dann Präfix mit einem großen "N"),

    oder

  • Die Abfrage wurde in einer Datenbank ausgeführt, die eine thailändische Standardsortierung hat

dann würden die thailändischen Zeichen wie erwartet gespeichert.

Das folgende Beispiel demonstriert dieses Verhalten. Ich verwende ein thailändisches Schriftzeichen Khomut U+0E5B auf einer Instanz mit einem Korean_100_CS_AS_KS_WS_SC Standardsortierung auf Instanzebene. Die Zielspalte hat eine Sortierung von Thai_CI_AS . Erstens, während die "aktuelle" DB nicht ist Wenn ich eine thailändische Standardsortierung habe, füge ich das Zeichen zweimal hinzu:einmal mit vorangestelltem "N" und einmal ohne Präfix auf dem Zeichenfolgenliteral:

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

Als nächstes wechsle ich zu einer DB, die macht haben eine thailändische Standardsortierung und fügen nur die Zeichenfolge ohne Präfix ein (keine wirkliche Notwendigkeit, die Zeichenfolge mit dem Präfix „N“ erneut zu testen):

USE [other_db];

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


SELECT * FROM #Thai;

Das Ergebnis ist:

ID  Col1
1   ?
2   ๛
3   ๛

Wie Sie sehen können (Punkt # unten bezieht sich auf ID # in den Ergebnissen oben):

  1. Die Zeichenfolge ohne „N“-Präfix, die in einer Datenbank verwendet wird, die eine nicht-thailändische Standardsortierung verwendet, wurde in ? übersetzt
  2. Die Zeichenfolge mit dem Präfix "N", die auch in einer DB mit einer nicht-thailändischen Standardsortierung verwendet wird, speicherte den Wert korrekt
  3. Die Zeichenfolge ohne "N"-Präfix, die in einer Datenbank verwendet wird, die eine thailändische Standardsortierung hat, speicherte den Wert korrekt