Проблема сравнения строк SQL-сервера с китайским пробелом - PullRequest
2 голосов
/ 18 мая 2010

В моей базе данных сервера sql есть запись со следующим значением для столбца nvarchar: '穂 坂' Второй символ - это значение Unicode 0x20, которое является простым пробелом.

Для этого столбца существует ограничение уникального ключа.

Я получаю нарушение уникального ключа при попытке вставить следующее значение: '穂 坂' В этой строке вторым символом является значение Unicode 0x3000, которое является символом китайского пробела.

Почему я получаю нарушение уникального ключа? Почему сервер sql «конвертирует» китайский символ пробела в простой пробел?

Заранее спасибо за любые идеи! Кстати, мое сопоставление - SQL_Latin1_General_CP1_CI_AS.

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Во-первых, вы можете использовать тип строки approriate в SQL, включая параметры сортировки. Во-вторых, вы можете использовать строки UNICODE, начинающиеся с префикса N.

Пример:

SELECT CAST(N'穂 坂' COLLATE Chinese_Simplified_Pinyin_100_BIN2 AS VARBINARY(32)) 

=> 0x427A20004257

SELECT CAST(N'穂 坂' COLLATE Chinese_Simplified_Pinyin_100_BIN2 AS VARBINARY(32))

=> 0x427A00304257

0 голосов
/ 18 мая 2010

Может быть, ваша сортировка не зависит от ширины .

Рассмотрит:

  • изменяя параметры сортировки вашей базы данных на те, которые соответствуют вашим потребностям и чувствительны к ширине.
  • изменить параметры сортировки для этого конкретного столбца на столбец, чувствительный к ширине. Это может / приведет к большему количеству предложений COLLATE во всех ваших хранимых процессах и т. Д. Не уверен, что это рекомендовано DBA.

alt text

...