Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server zwraca ??? gdy kolumna jest aktualizowana znakami tajlandzkimi

W pytaniu nie ma zbyt wielu informacji. Wiemy tylko, że:

  • Kolumna używa sortowania Thai_CI_AS (przynajmniej to brzmi tak, jakby pytanie brzmi)
  • Przekazywane są tajskie znaki
  • Co jest przechowywane w kolumnie to:???

Jednak już z tego możemy wywnioskować dwie rzeczy:

  1. Przychodzący ciąg nie jest ani NVARCHAR parametr / zmienna ani nie jest to literał ciągu znaków poprzedzony wielką literą „N”,

    i

  2. Domyślne sortowanie bazy danych, w której wykonywane jest zapytanie (niekoniecznie bazy danych, w której istnieje tabela) to nie tajskie zestawienie.

Nie wiemy, czy kolumna docelowa to VARCHAR lub NVARCHAR , ale nie ma to znaczenia, jeśli sortowanie kolumny jest sortowaniem tajskim (ponieważ umożliwi to VARCHAR dane do przechowywania znaków tajskich i NVARCHAR zadziała niezależnie).

Jeśli albo :

  • przychodzący ciąg używa NVARCHAR parametr (lub jeśli literał ciągu, to przedrostek z wielką literą "N"),

    lub

  • zapytanie zostało wykonane w bazie danych, która ma domyślne sortowanie w języku tajskim

wtedy znaki tajskie zostaną zapisane zgodnie z oczekiwaniami.

Poniższy przykład ilustruje to zachowanie. Używam Tajskiego znaku Khomuta U+0E5B na instancji mającej kod Korean_100_CS_AS_KS_WS_SC Domyślne sortowanie na poziomie instancji. Kolumna docelowa ma sortowanie Thai_CI_AS . Po pierwsze, „bieżąca” baza danych nie mają domyślne sortowanie w języku tajskim, dodaję znak dwa razy:raz z prefiksem "N" i raz bez prefiksu w literale ciągu:

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

Następnie przełączam się na bazę danych, która robi mieć domyślne sortowanie w języku tajskim i wstawić tylko ciąg bez prefiksu (nie ma potrzeby ponownego testowania ciągu z prefiksem "N"):

USE [other_db];

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


SELECT * FROM #Thai;

Wynik:

ID  Col1
1   ?
2   ๛
3   ๛

Jak widać (punkt # poniżej odnosi się do ID # w wynikach powyżej):

  1. Ciąg bez prefiksu "N", używany w bazie danych używającej domyślnego sortowania innego niż tajski, został przetłumaczony na ?
  2. Ciąg z przedrostkiem "N", używany również w bazie danych używającej domyślnego sortowania innego niż tajski, przechowywał wartość poprawnie
  3. Ciąg bez prefiksu "N", używany w bazie danych, która ma domyślne sortowanie w języku tajskim, przechowuje wartość poprawnie



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Plusy i minusy używania SqlCommand Prepare w C#?

  2. Miejsca dziesiętne w formacie SQL Server z przecinkami

  3. Jak dowiedzieć się, do której tabeli należy blokada strony?

  4. Jak usunąć 8 500 000 rekordów z jednej tabeli na serwerze sql

  5. Jak ustawić parametry połączenia SQL Server?