sql >> Database >  >> RDS >> Sqlserver

SQL Server keert terug ??? wanneer de kolom wordt bijgewerkt met Thaise tekens

Er is niet veel informatie in de vraag. Alles wat we weten is:

  • Kolom gebruikt sortering van Thai_CI_AS (tenminste dat het zo was, klinkt alsof de vraag aangeeft)
  • Thaise tekens worden doorgegeven
  • Wat wordt opgeslagen in de kolom is:???

Hieruit alleen kunnen we echter twee dingen afleiden:

  1. De binnenkomende string is geen NVARCHAR parameter / variabele, noch is het een letterlijke tekenreeks die wordt voorafgegaan door een hoofdletter "N",

    en

  2. De standaard sortering voor de DB waarin de query wordt uitgevoerd (niet noodzakelijk de DB waarin de tabel bestaat) is niet een Thaise verzameling.

We weten niet of de bestemmingskolom VARCHAR is of NVARCHAR , maar dat maakt niet uit of de sortering van de kolom een ​​Thaise sortering is (aangezien dat VARCHAR zal toestaan gegevens voor Thaise karakters, en NVARCHAR zou hoe dan ook werken).

Als ofwel :

  • de inkomende string gebruikt een NVARCHAR parameter (of indien letterlijke tekenreeks, dan prefix met een hoofdletter "N"),

    of

  • de query is uitgevoerd in een database met een Thaise standaardsortering

dan zouden de Thaise karakters worden opgeslagen zoals verwacht.

Het volgende voorbeeld laat dit gedrag zien. Ik gebruik een Thai Character Khomut U+0E5B op een instantie met een Korean_100_CS_AS_KS_WS_SC Standaard sortering op exemplaarniveau. De bestemmingskolom heeft een sortering van Thai_CI_AS . Ten eerste, terwijl de "huidige" DB er een is die niet een Thaise standaardsortering hebben, voeg ik het teken twee keer toe:een keer voorafgegaan door "N" en een keer zonder voorvoegsel op de letterlijke tekenreeks:

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

Vervolgens schakel ik over naar een DB die doet een Thaise standaardsortering hebben en alleen de string zonder prefix invoegen (het is niet echt nodig om de string met de prefix "N" opnieuw te testen):

USE [other_db];

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


SELECT * FROM #Thai;

Het resultaat is:

ID  Col1
1   ?
2   ๛
3   ๛

Zoals je kunt zien (punt # hieronder heeft betrekking op ID # in bovenstaande resultaten):

  1. De niet-"N"-prefix, gebruikt in een DB met een niet-Thaise standaardsortering, is vertaald in ?
  2. De tekenreeks met "N"-prefix, ook gebruikt in een database met een niet-Thaise standaardsortering, heeft de waarde correct opgeslagen
  3. De niet-"N"-prefix, gebruikt in een DB die wel een Thaise standaardsortering heeft, heeft de waarde correct opgeslagen



  1. Zoeken naar meerdere nummers in veld met meerdere nummers

  2. MySQL-rijen worden verwijderd wanneer het programma wordt afgesloten

  3. Genereer alle mogelijke combinaties van strings van bepaalde lengte in orakel

  4. Probleem bij het weergeven van zoekopdrachtresultaten