sql >> Databáze >  >> RDS >> Sqlserver

SQL Server vrací ??? když je sloupec aktualizován thajskými znaky

V dotazu není uvedeno mnoho informací. Vše, co víme, je:

  • Sloupec používá řazení Thai_CI_AS (alespoň, že to tak bylo, to zní tak, jak to říká otázka)
  • Thajské znaky jsou předávány
  • Ve sloupci je uloženo:???

Již z toho však můžeme vyvodit dvě věci:

  1. Příchozí řetězec není ani NVARCHAR parametr / proměnná, ani to není řetězcový literál s předponou s velkým "N",

    a

  2. Výchozí řazení pro databázi, ve které je dotaz prováděn (ne nutně DB, ve které tabulka existuje), není thajské řazení.

Nevíme, zda je cílový sloupec VARCHAR nebo NVARCHAR , ale to nezáleží na tom, zda je řazení ve sloupci thajské řazení (protože to umožní VARCHAR data pro uložení thajských znaků a NVARCHAR bude fungovat bez ohledu na to).

Pokud buď :

  • příchozí řetězec používá NVARCHAR parametr (nebo pokud je řetězcový literál, pak předpona s velkým "N"),

    nebo

  • dotaz byl proveden v databázi, která má výchozí thajské řazení

pak by se thajské znaky uložily podle očekávání.

Následující příklad ukazuje toto chování. Používám Thajský znak Khomut U+0E5B v instanci s Korean_100_CS_AS_KS_WS_SC Výchozí řazení na úrovni instance. Cílový sloupec má řazení Thai_CI_AS . Za prvé, zatímco „aktuální“ DB je taková, která není mají výchozí thajské řazení, přidávám znak dvakrát:jednou s předponou "N" a jednou bez předpony v řetězcovém literálu:

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ále přepnu na DB, která dělá mít výchozí thajské řazení a vložit pouze řetězec bez předpony (není potřeba znovu testovat řetězec s předponou "N"):

USE [other_db];

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


SELECT * FROM #Thai;

Výsledek je:

ID  Col1
1   ?
2   ๛
3   ๛

Jak můžete vidět (bod # níže se vztahuje k ID # ve výsledcích výše):

  1. Řetězec s předponou "N" použitý v databázi používající jiné než thajské výchozí řazení byl přeložen do ?
  2. Řetězec s předponou "N", používaný také v databázi používající jiné než thajské výchozí řazení, uložil hodnotu správně
  3. Řetězec s předponou "N" použitý v databázi, která má thajské výchozí řazení, uložil hodnotu správně



  1. Entity Framework – One-to-One – ReferentialConstraint je mapován na sloupec generovaný obchodem

  2. Postgres:Odlišné, ale pouze pro jeden sloupec

  3. Podmíněný příkaz INSERT INTO v postgresu

  4. Vysoká numerická přesnost plave s MySQL a SQLAlchemy ORM