sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server returnerar ??? när kolumnen uppdateras med thailändska tecken

Det finns inte mycket information i frågan. Allt vi vet är:

  • Kolumnen använder sortering av Thai_CI_AS (åtminstone att det var det låter som att frågan står)
  • Thailändska tecken skickas in
  • Det som lagras i kolumnen är:???

Men bara utifrån det kan vi härleda två saker:

  1. Den inkommande strängen är varken en NVARCHAR parameter / variabel, och det är inte heller en strängliteral som är prefixet med ett versaler "N",

    och

  2. Standardsorteringen för den DB där frågan körs (inte nödvändigtvis den DB där tabellen finns) är inte en thailändsk samling.

Vi vet inte om destinationskolumnen är VARCHAR eller NVARCHAR , men det spelar ingen roll om kolumnsamlingen är en thailändsk samling (eftersom det tillåter VARCHAR data som innehåller thailändska tecken och NVARCHAR skulle fungera oavsett).

Om antingen :

  • den inkommande strängen använder en NVARCHAR parameter (eller om strängen är bokstavlig, prefixet med ett versaler "N"),

    eller

  • frågan kördes i en DB som har en thailändsk standardsortering

sedan skulle de thailändska tecknen lagras som förväntat.

Följande exempel visar detta beteende. Jag använder en Thai Character Khomut U+0E5B på en instans som har en Korean_100_CS_AS_KS_WS_SC Standardsortering på instansnivå. Målkolumnen har en sortering av Thai_CI_AS . För det första, medan den "nuvarande" DB är en som inte gör det har en thailändsk standardsortering lägger jag till tecknet två gånger:en gång med prefixet "N" och en gång utan prefix på strängen bokstavlig:

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

Därefter byter jag till en DB som gör ha en thailändsk standardsortering och infoga bara strängen utan prefix (inget behov av att testa strängen med "N"-prefix igen):

USE [other_db];

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


SELECT * FROM #Thai;

Resultatet är:

ID  Col1
1   ?
2   ๛
3   ๛

Som du kan se (punkt # nedan relaterar till ID # i resultaten ovan):

  1. Strängen utan "N"-prefix, som används i en DB med en icke-thailändsk standardsortering, översattes till ?
  2. Strängen med "N"-prefix, som också används i en DB som använder en icke-thailändsk standardsortering, lagrade värdet korrekt
  3. Strängen utan "N"-prefix, som används i en DB som har en thailändsk standardsortering, lagrade värdet korrekt



  1. Streama databaserade bilder med hjälp av HttpHandler

  2. Hitta alla medförfattare - Fasettering/gruppering för många till många kartläggningstabeller

  3. Upptäcka rader med samma kombination av siffror i de två första kolumnerna och välja den med högst nummer i den tredje kolumnen

  4. postgresql:delning av tidsperiod vid händelse