Я обновил столбец с тайскими иероглифами. При выборе из него возвращает: ???
. Я попытался установить сопоставление на Thai_CI_AS
, но оно все еще не работает.
SQL Server возвращает ??? когда столбец обновляется тайскими символами
Ответы (1)
В вопросе не так много информации. Все, что мы знаем, это:
- Столбец использует сопоставление
Thai_CI_AS
(по крайней мере, это звучит так, как говорится в вопросе) - Тайские символы передаются в
- В столбце хранится:
???
Однако уже из этого мы можем сделать два вывода:
Входящая строка не является ни параметром/переменной
NVARCHAR
, ни строковым литералом с префиксом N в верхнем регистре,и
Сопоставление по умолчанию для БД, в которой выполняется запрос (не обязательно БД, в которой существует таблица), не тайское сопоставление.
Мы не знаем, является ли целевой столбец 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 # в результатах выше):
- Строка без префикса N, используемая в БД с нетайским сопоставлением по умолчанию, была переведена в
?
. - Строка с префиксом N, также используемая в БД с нетайским сопоставлением по умолчанию, правильно сохранила значение.
- Строка без префикса N, используемая в БД, которая имеет сопоставление по умолчанию для тайского языка, правильно сохранила значение.