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

Откуда: Оттуда...
Сообщений: 26933
В поле NVarchar записано "Aaa"

where [field] = N'Aaa'
и
where [field] = N'aaa'

дают разные рез-ты. Вернее второй вариант не возращает записи где в поле записано "Aaa"

Как перформулироваь запрос что б сравнение стало регистронезависимым?
29 июн 11, 20:13    [10895797]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с полем nvarchar. Как сделать case insensitive сравнение и выборку?  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26933
where LOWER([field]) = N'aaa' 

Так врде работает...
29 июн 11, 20:18    [10895809]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с полем nvarchar. Как сделать case insensitive сравнение и выборку?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
where [field] = N'Aaa' COLLATE Cyrillic_General_CI_AI
??
29 июн 11, 20:18    [10895812]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с полем nvarchar. Как сделать case insensitive сравнение и выборку?  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26933
iap
where [field] = N'Aaa' COLLATE Cyrillic_General_CI_AI
??


А причём тут Cyrillic_General_CI_AI?
Там текст в юникоде записан - может и китайский и арабский быть.
Или я чего-то не понял?
29 июн 11, 20:46    [10895867]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с полем nvarchar. Как сделать case insensitive сравнение и выборку?  [new]
BPK
Member

Откуда: ни: возьмись.
Сообщений: 1601
M234
iap
where [field] = N'Aaa' COLLATE Cyrillic_General_CI_AI
??


А причём тут Cyrillic_General_CI_AI?
Там текст в юникоде записан - может и китайский и арабский быть.
Или я чего-то не понял?

А как по твоему сравнивальщик узнает, что символ с кодом NNN это заглавная версия символа с кодом MMM ?
Хотя, конечно, можно было бы сделать CI сразу для всех культур мира.
29 июн 11, 20:48    [10895876]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с полем nvarchar. Как сделать case insensitive сравнение и выборку?  [new]
BPK
Member

Откуда: ни: возьмись.
Сообщений: 1601
M234
where LOWER([field]) = N'aaa' 

Так врде работает...

Т.е. проблема решена?
29 июн 11, 20:57    [10895896]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с полем nvarchar. Как сделать case insensitive сравнение и выборку?  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26933
BPK
M234
where LOWER([field]) = N'aaa' 

Так врде работает...

Т.е. проблема решена?


Да.
Всем спасибо.
29 июн 11, 21:47    [10896020]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с полем nvarchar. Как сделать case insensitive сравнение и выборку?  [new]
BPK
Member

Откуда: ни: возьмись.
Сообщений: 1601
M234
BPK
Т.е. проблема решена?

Да.
Всем спасибо.

А для китайского и арабского попробовал? ;)
30 июн 11, 12:29    [10898572]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с полем nvarchar. Как сделать case insensitive сравнение и выборку?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Да.
> Всем спасибо.

ню-ню.

declare @t table (c nvarchar(max))
insert into @t values (N'I')

select
   c collate Turkish_CI_AI
   , unicode(c collate Turkish_CI_AI)
   , lower(c collate Turkish_CI_AI)
   , unicode(lower(c collate Turkish_CI_AI))
   , c collate Latin1_General_CI_AI
   , unicode(c collate Latin1_General_CI_AI)
   , lower(c collate Latin1_General_CI_AI)
   , unicode(lower(c collate Latin1_General_CI_AI))
from @t

не зная явно языка, корректно вы сравнить строки без учета регистра не сможете.

Posted via ActualForum NNTP Server 1.4

30 июн 11, 12:53    [10898827]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с полем nvarchar. Как сделать case insensitive сравнение и выборку?  [new]
BPK
Member

Откуда: ни: возьмись.
Сообщений: 1601
daw
не зная явно языка, корректно вы сравнить строки без учета регистра не сможете.

Автор топика прав. В Юникоде символы жёстко привязаны к кодам, поэтому можно точно сказать, что символ с кодом M - строчная буква русского языка, а N - заглавная из турецкого.
Единственное, где я вижу проблему - если разные языки используют, скажем, одну и ту же расширенную латиницу, а порядок букв в алфавите у них разный. Есть ли такая проблема на деле - я не знаю.
30 июн 11, 20:49    [10902773]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с полем nvarchar. Как сделать case insensitive сравнение и выборку?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
BPK
daw
не зная явно языка, корректно вы сравнить строки без учета регистра не сможете.

Автор топика прав. В Юникоде символы жёстко привязаны к кодам, поэтому можно точно сказать, что символ с кодом M - строчная буква русского языка, а N - заглавная из турецкого.
Единственное, где я вижу проблему - если разные языки используют, скажем, одну и ту же расширенную латиницу, а порядок букв в алфавите у них разный. Есть ли такая проблема на деле - я не знаю.


проблема сравнения nvarchar вылезет сразу же как только у строк будет разный collation.

пример: восстановил базу от юзера, процедура использует временную таблицу и делает джойн данных из
временной и постоянной таблицы, коллейшины разные у баз - здесь проблема.
30 июн 11, 20:59    [10902800]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с полем nvarchar. Как сделать case insensitive сравнение и выборку?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
BPK
Единственное, где я вижу проблему - если разные языки используют, скажем, одну и ту же расширенную латиницу, а порядок букв в алфавите у них разный. Есть ли такая проблема на деле - я не знаю.


ну, я же, вроде, показал, что есть. турки как раз используют расширенную латиницу, да. но при этом I и i - это у них разные буквы, а не одна и та же. может, и еще где есть такое.
30 июн 11, 22:48    [10903195]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с полем nvarchar. Как сделать case insensitive сравнение и выборку?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
daw
может, и еще где есть такое.

ну, конечно, может быть, что это единственное такое исключение, когда строки даже на равенство сравнить без учета регистра нельзя, не зная языка, - я про другие не слышал, признаюсь - и проблема тогда надуманная получается. но, вот такая вот капелька дегтя. :)
30 июн 11, 22:56    [10903220]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить