SQL Server возвращает ??? когда столбец обновляется тайскими символами

Я обновил столбец с тайскими иероглифами. При выборе из него возвращает: ???. Я попытался установить сопоставление на Thai_CI_AS, но оно все еще не работает.


person user3916664    schedule 09.10.2014    source источник


Ответы (1)


В вопросе не так много информации. Все, что мы знаем, это:

  • Столбец использует сопоставление Thai_CI_AS (по крайней мере, это звучит так, как говорится в вопросе)
  • Тайские символы передаются в
  • В столбце хранится: ???

Однако уже из этого мы можем сделать два вывода:

  1. Входящая строка не является ни параметром/переменной NVARCHAR, ни строковым литералом с префиксом N в верхнем регистре,

    и

  2. Сопоставление по умолчанию для БД, в которой выполняется запрос (не обязательно БД, в которой существует таблица), не тайское сопоставление.

Мы не знаем, является ли целевой столбец VARCHAR или NVARCHAR, но это не имеет значения, является ли сопоставление столбца тайским сопоставлением (поскольку это позволит VARCHAR данным содержать тайские символы, а NVARCHAR будет работать независимо).

Если либо:

  • входящая строка использует параметр NVARCHAR (или, если строковый литерал, префикс с N в верхнем регистре),

    or

  • запрос был выполнен в БД с тайской сортировкой по умолчанию

тогда тайские символы будут сохранены, как и ожидалось.

Следующий пример демонстрирует это поведение. Я использую тайский символ Khomut U+0E5B в экземпляре с Korean_100_CS_AS_KS_WS_SC уровнем экземпляра по умолчанию. Сопоставление. Столбец назначения имеет сопоставление Thai_CI_AS. Во-первых, хотя текущая БД не имеет сопоставление по умолчанию для тайского языка, я добавляю символ дважды: один раз с префиксом N и один раз без префикса в строковом литерале:

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

Затем я переключаюсь на базу данных, которая имеет сортировку по умолчанию для тайского языка, и вставляю только строку без префикса (нет необходимости повторно тестировать строку с префиксом N):

USE [other_db];

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


SELECT * FROM #Thai;

Результат:

ID  Col1
1   ?
2   ๛
3   ๛

Как вы можете видеть (точка # ниже относится к ID # в результатах выше):

  1. Строка без префикса N, используемая в БД с нетайским сопоставлением по умолчанию, была переведена в ?.
  2. Строка с префиксом N, также используемая в БД с нетайским сопоставлением по умолчанию, правильно сохранила значение.
  3. Строка без префикса N, используемая в БД, которая имеет сопоставление по умолчанию для тайского языка, правильно сохранила значение.
person Solomon Rutzky    schedule 09.10.2014