Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 проблема с Collation - прояните плз  [new]
Vladimir2222x
Member

Откуда:
Сообщений: 8
Здравствуйте!

Имеем MSSQL 2008. База данных с Collation Latin1_General_CI_AS.
Таблица Userprofile тоже имеет Collation Latin1_General_CI_AS

Выполняю запрос, принудительно ставя колэйшн:

select * from Userprofile where FirstName like '%Вася%' collate Cyrillic_General_CI_AS

В результате вижу пустой резалтсет....

А вот далее делаю:
ALTER DATABASE "MKP" COLLATE Cyrillic_General_CI_AS 
select * from Userprofile where FirstName like '%Вася%' collate Cyrillic_General_CI_AS

В результате вижу Васю.

В чем дело? Почему так? Ведь колэйшн указывается в запросе. По-идее, колэйшн базы данных не должен влиять...

Спасибо за ответы.
3 окт 12, 22:00    [13264378]     Ответить | Цитировать Сообщить модератору
 Re: проблема с Collation - прояните плз  [new]
step_ks
Member

Откуда:
Сообщений: 936
тип поля FirstName какой?
3 окт 12, 22:03    [13264381]     Ответить | Цитировать Сообщить модератору
 Re: проблема с Collation - прояните плз  [new]
Vladimir2222x
Member

Откуда:
Сообщений: 8
step_ks
тип поля FirstName какой?

Пардон, забыл написать. Тип поля nvarchar(50).
3 окт 12, 22:24    [13264451]     Ответить | Цитировать Сообщить модератору
 Re: проблема с Collation - прояните плз  [new]
step_ks
Member

Откуда:
Сообщений: 936
Литералы вроде как сначала приводятся к коллэйшену текущей базы, т.е. вы теряете Васю по сути еще до collate.
3 окт 12, 22:34    [13264487]     Ответить | Цитировать Сообщить модератору
 Re: проблема с Collation - прояните плз  [new]
step_ks
Member

Откуда:
Сообщений: 936
Collation Precedence
3 окт 12, 22:35    [13264491]     Ответить | Цитировать Сообщить модератору
 Re: проблема с Collation - прояните плз  [new]
Vladimir2222x
Member

Откуда:
Сообщений: 8
step_ks,

И как же быть? У меня в базе - данные на двух языках. Соответственно, поиск должен производится в разных колэйшнах.

Неужели задача нерешаемая? Или при каждом запросе надо менять дефолтный колэйшн всей базы? Хммммммммммм.
3 окт 12, 22:37    [13264498]     Ответить | Цитировать Сообщить модератору
 Re: проблема с Collation - прояните плз  [new]
Vladimir2222x
Member

Откуда:
Сообщений: 8
Решил! Нужно символ N поставить перед литералом

select * from Userprofile where FirstName like N'%Вася%' collate Cyrillic_General_CI_AS

Работает!
3 окт 12, 22:42    [13264517]     Ответить | Цитировать Сообщить модератору
 Re: проблема с Collation - прояните плз  [new]
step_ks
Member

Откуда:
Сообщений: 936
Так и без collate работать будет.
3 окт 12, 22:59    [13264584]     Ответить | Цитировать Сообщить модератору
 Re: проблема с Collation - прояните плз  [new]
Vladimir2222x
Member

Откуда:
Сообщений: 8
step_ks,

Без collate поиск получается не case insensitive. А мне нужен именно CI.
4 окт 12, 01:38    [13265030]     Ответить | Цитировать Сообщить модератору
 Re: проблема с Collation - прояните плз  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
step_ks
Так и без collate работать будет.
collate есть всегда. Это правила сортировки в первую очередь.
А кодировка только для не уникода, косвенно.

А константы и переменные всегда в правилах сортировки (и кодировке для не N) базы.
4 окт 12, 01:55    [13265051]     Ответить | Цитировать Сообщить модератору
 Re: проблема с Collation - прояните плз  [new]
step_ks
Member

Откуда:
Сообщений: 936
Vladimir2222x
step_ks,

Без collate поиск получается не case insensitive. А мне нужен именно CI.

Vladimir2222x
Здравствуйте!

Имеем MSSQL 2008. База данных с Collation Latin1_General_CI_AS.
Таблица Userprofile тоже имеет Collation Latin1_General_CI_AS
4 окт 12, 08:23    [13265279]     Ответить | Цитировать Сообщить модератору
 Re: проблема с Collation - прояните плз  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Vladimir2222x
step_ks,

Без collate поиск получается не case insensitive. А мне нужен именно CI.
CI образовано первыми буквами слов "Case Insensitive"
4 окт 12, 09:43    [13265537]     Ответить | Цитировать Сообщить модератору
 Re: проблема с Collation - прояните плз  [new]
Vladimir2222x
Member

Откуда:
Сообщений: 8
step_ks
Vladimir2222x
step_ks,

Без collate поиск получается не case insensitive. А мне нужен именно CI.

Vladimir2222x
Здравствуйте!

Имеем MSSQL 2008. База данных с Collation Latin1_General_CI_AS.
Таблица Userprofile тоже имеет Collation Latin1_General_CI_AS


И что? Я же говорю: не работает! База в collate Latin1 CI, но этот LATIN1! В случае поиска по русскому тексту используется бинарный поиск. Чтобы искало в режиме CI, нужно явно указывать Cyrillic_CI!!!!
4 окт 12, 11:13    [13266133]     Ответить | Цитировать Сообщить модератору
 Re: проблема с Collation - прояните плз  [new]
Vladimir2222x
Member

Откуда:
Сообщений: 8
iap
Vladimir2222x
step_ks,

Без collate поиск получается не case insensitive. А мне нужен именно CI.
CI образовано первыми буквами слов "Case Insensitive"

Перечитайте что я написал. Конечно я знаю что такое CI,
Да, мне нужен case insensitive. Поэтому я и добавляю Collate Cyrillic_CI.


Еще раз. База в Latin1_CI. Т.е. Case Insensitive для латинских символов. Но поиск по кириллической строке работает в режиме CS, тк Latin1 не понимает кириллицу. Т.е. для LATIN1_CI "Ы" и "ы" - разные символы.

А вот для Cyrillic_CI "Ы"="ы". Поэтому я и добавляю Collate Cyrillic_CI.


Так понятно? 8-)
4 окт 12, 11:18    [13266171]     Ответить | Цитировать Сообщить модератору
 Re: проблема с Collation - прояните плз  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Vladimir2222x, врёте вы всё:
SELECT 1 WHERE N'_вася_' LIKE N'%Вася%' COLLATE Latin1_General_CI_AS
SELECT 1 WHERE N'_вася_' LIKE N'%Вася%' COLLATE Cyrillic_General_CI_AS
SELECT 1 WHERE N'_вася_' LIKE N'%Вася%' COLLATE Chinese_Taiwan_Stroke_CI_AS

SELECT 1 WHERE N'_вася_' LIKE N'%Вася%' COLLATE Latin1_General_CS_AS
SELECT 1 WHERE N'_вася_' LIKE N'%Вася%' COLLATE Cyrillic_General_CS_AS
SELECT 1 WHERE N'_вася_' LIKE N'%Вася%' COLLATE Chinese_Taiwan_Stroke_CS_AS
Пофигу что там. Latin1 или Cyrillic или Chinese_Taiwan.
У вас колонки в уникоде. Или вы врёте.
4 окт 12, 16:25    [13269022]     Ответить | Цитировать Сообщить модератору
 Re: проблема с Collation - прояните плз  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SELECT	 Convert(VarChar,N'Вася' COLLATE        Latin1_General_CI_AS)
	,Convert(VarChar,N'Вася' COLLATE      Cyrillic_General_CI_AS)
	,Convert(VarChar,N'Вася' COLLATE Chinese_Taiwan_Stroke_CI_AS)

SELECT	 CASE WHEN N'Вася' = Convert(VarChar,N'Вася' COLLATE   Latin1_General_CI_AS) THEN 1 ELSE 0 END
	,CASE WHEN N'????' = Convert(VarChar,N'Вася' COLLATE   Latin1_General_CI_AS) THEN 1 ELSE 0 END
	,CASE WHEN N'Вася' = Convert(VarChar,N'Вася' COLLATE Cyrillic_General_CI_AS) THEN 1 ELSE 0 END
	,CASE WHEN N'????' = Convert(VarChar,N'Вася' COLLATE Cyrillic_General_CI_AS) THEN 1 ELSE 0 END
Для понимания.
4 окт 12, 16:36    [13269115]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить