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

Откуда: Kiev
Сообщений: 100
Добрый день.
Есть необходимость проверить две строки на равенство. Строки могут содержать латинские, кириллические датские (ÆæØøÅå), шведские (ÅÄÖåäö) символы.
Как оказалось такой код (там несколько разных вариантов проверки) не работает (возвращает все время Equal):
DECLARE @First NVARCHAR(MAX) 
DECLARE @Second NVARCHAR(MAX) 
SELECT @First = 'Ы', @Second = 'ы' 

-- SELECT @First, @Second, BINARY_CHECKSUM(@First), BINARY_CHECKSUM(@Second) 
-- IF CONVERT(VARBINARY(500), @First) = CONVERT(VARBINARY(500), @Second)
IF BINARY_CHECKSUM(@First) = BINARY_CHECKSUM(@Second) 
-- IF (@First = @Second COLLATE database_default ) -- SQL_Latin1_General_CP1_CS_AS)

BEGIN
	PRINT 'Equal'
END
ELSE
BEGIN
	PRINT 'Different'
END

Посоветуйте, как выкрутиться?
6 авг 15, 13:16    [17983580]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
o-o
Guest
DECLARE @First NVARCHAR(MAX) 
DECLARE @Second NVARCHAR(MAX) 
SELECT @First = N'Ы', @Second = N'ы' 
6 авг 15, 13:20    [17983615]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
Glory
Member

Откуда:
Сообщений: 104751
Anatoliy
Посоветуйте, как выкрутиться?

Ну так вот он правильный подход - IF (@First = @Second COLLATE database_default ) -- SQL_Latin1_General_CP1_CS_AS)
6 авг 15, 13:20    [17983621]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
Владислав Колосов
Member

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

уверены? Я получаю Different для примера, как и должно быть.
6 авг 15, 13:26    [17983658]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
o-o
Guest
у него любой подход не работал:
Anatoliy
Как оказалось такой код (там несколько разных вариантов проверки) не работает (возвращает все время Equal):

т.к. передает кириллицу неюникодом в контексте некириллической базы.
разумеется, всегда кириллица превращается в знаки вопроса
6 авг 15, 13:27    [17983671]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
o-o
Guest
Владислав Колосов
Anatoliy,

уверены? Я получаю Different для примера, как и должно быть.

ну поздравимся, у вас база кириллическая :)
6 авг 15, 13:29    [17983684]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
Maxx_UA
Guest
declare @t table (n nvarchar(20))
declare @w nvarchar(20) =N'ЧТО'
declare @v2 nvarchar(20) =N'что'
insert into  @t (n) values (N'ЧТО'),(N'что')

select BINARY_CHECKSUM(n), BINARY_CHECKSUM(@w),BINARY_CHECKSUM(@v2) from @t
if BINARY_CHECKSUM(@w) != BINARY_CHECKSUM(@v2)  print ':)'

Шось нескладуеться..т.е. не воспроизводиться ,у меня сервер не кейс сентсатив
BINARY_CHECKSUM

автор
CHECKSUM and BINARY_CHECKSUM return different values for the string data types, where locale can cause strings with different representation to compare equal. The string data types are char, varchar, nchar, nvarchar, or sql_variant (if the base type of sql_variant is a string data type). For example, the BINARY_CHECKSUM values for the strings "McCavity" and "Mccavity" are different. In contrast, in a case-insensitive server, CHECKSUM returns the same checksum values for those strings. CHECKSUM values should not be compared with BINARY_CHECKSUM values.
6 авг 15, 13:29    [17983685]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
Anatoliy
Member

Откуда: Kiev
Сообщений: 100
Сорри, забыл уточнить: у меня SQL Server 2008
Возможно поэтому ругается на строку
SELECT @First = N'Ы', @Second = N'ы' 

Incorrect syntax near 'Ы'.

To Glory:
вариант
IF (@First = @Second COLLATE database_default )

возвращает Equal
6 авг 15, 13:30    [17983693]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
Glory
Member

Откуда:
Сообщений: 104751
Anatoliy
To Glory:
вариант
IF (@First = @Second COLLATE database_default )


возвращает Equal

Я же сказал "подход", а не конечное решение
6 авг 15, 13:31    [17983709]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
o-o
Guest
Anatoliy
Сорри, забыл уточнить: у меня SQL Server 2008
Возможно поэтому ругается на строку
SELECT @First = N'Ы', @Second = N'ы' 

Incorrect syntax near 'Ы'.

да ладно. у меня тоже 2008, все без ошибок.
и что, без N не было ошибки?
6 авг 15, 13:35    [17983741]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
Anatoliy
Member

Откуда: Kiev
Сообщений: 100
BINARY_CHECKSUM для 'Ы' и 'ы' возвращает одинаковые значения - 63

DECLARE @First NVARCHAR(MAX) 
DECLARE @Second NVARCHAR(MAX) 
SELECT @First = 'Ы', @Second = 'ы' 
SELECT BINARY_CHECKSUM(@First), BINARY_CHECKSUM(@Second) 
6 авг 15, 13:36    [17983751]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
Anatoliy
Member

Откуда: Kiev
Сообщений: 100
o-o,

Без N не ругается...
6 авг 15, 13:38    [17983764]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
Maxx_UA
Guest
Anatoliy,

Потому что вы упорно не читаете ответов на свои вопросы
6 авг 15, 13:38    [17983766]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8570
o-o
Владислав Колосов
Anatoliy,

уверены? Я получаю Different для примера, как и должно быть.

ну поздравимся, у вас база кириллическая :)


Причем здесь это? BINARY_CHECKSUM() вычисляет контрольные суммы двоичного представления строки без применения collation преобразований. Все равно, что превратить строку в VARBINARY и сравнить с другой такой же.

DECLARE @First NVARCHAR(MAX) 
DECLARE @Second NVARCHAR(MAX) 
SELECT @First = 'Ы', @Second = 'ы' 

IF CAST(@First AS varbinary(200)) = CAST(@Second AS varbinary(200)) 
	PRINT 'Equal'
ELSE
	PRINT 'Different'
GO
6 авг 15, 13:40    [17983782]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
o-o
Guest
Anatoliy
o-o,

Без N не ругается...

картинкой, плиз.
мало ли как вы "скопировали".
а вот и мое, с версией сервера,
в контексте "латинской" базы,
юникодом и нет:

К сообщению приложен файл. Размер - 33Kb
6 авг 15, 13:40    [17983786]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
Maxx_UA
Guest
DECLARE @First NVARCHAR(MAX) 
DECLARE @Second NVARCHAR(MAX) 
SELECT @First = N'Ы', @Second = N'ы' 
SELECT BINARY_CHECKSUM(@First), BINARY_CHECKSUM(@Second) 

(No column name)	(No column name)
1067	1099

select @@version

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2876.0 (X64) 
	May 30 2013 10:18:43 
	Copyright (c) Microsoft Corporation
	Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
6 авг 15, 13:41    [17983791]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8570
Хм, получил равенство для базы с COLLATION
Latin1_General_CI_AS_KS_WS
6 авг 15, 13:44    [17983819]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
o-o
Guest
Владислав Колосов
o-o
пропущено...

ну поздравимся, у вас база кириллическая :)


Причем здесь это?

при том, при том.
попробуйте передать кириллицу в переменную
НЕЮНИКОДОМ В КОНТЕКСТЕ ЛАТИНСКОЙ БАЗЫ

К сообщению приложен файл. Размер - 13Kb
6 авг 15, 13:44    [17983823]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
o-o
Guest
Владислав Колосов
BINARY_CHECKSUM() вычисляет контрольные суммы двоичного представления строки без применения collation преобразований.

он-то вычисляет. для знака вопроса. ибо именно это получает сервер.
передавайте сразу бинарным представлением, будет все хорошо.
но ТС передает символом.
6 авг 15, 13:46    [17983849]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
o-o
Guest
Anatoliy,
картинку давайте с ошибкой, и чтобы было видно, что именно написано в коде.
перенаберите.
скопипасьте еще раз.
пробел может у вас между N и 'Ы'?
N набрано в нижнем регистре?
быстрее показать, чем все возможное перебрать
6 авг 15, 13:56    [17983953]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
Anatoliy
Member

Откуда: Kiev
Сообщений: 100
Еще раз сорри.
В строке
SELECT @First = N'Ъ', @Second = N'ъ'

Между N и 'Ъ' убрал пробел. Все отработало. Но всеравно возвратило Equal
Перечитываю топик. Пытаюсь прочитать между строк ответ на свой вопрос :)
6 авг 15, 13:56    [17983954]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
o-o
Guest
Anatoliy,

какой именно вариант выдал Equal ?
с COLLATE database_default?
у вас поди он CI.
почему так трудно показать весь код и целиком?

отсюда копипастить надо:
DECLARE @First NVARCHAR(MAX) 
DECLARE @Second NVARCHAR(MAX) 
SELECT @First = N'Ы', @Second = N'ы' 

 IF (@First = @Second COLLATE SQL_Latin1_General_CP1_CS_AS)
	select 'Equal'
ELSE
	select 'Different'
6 авг 15, 13:59    [17983969]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
Glory
Member

Откуда:
Сообщений: 104751
Anatoliy
Пытаюсь прочитать между строк ответ на свой вопрос

А вы всегда не смотрите на то, что у вас в начальных данных получилось и в промежуточных вычислениях ?
Вы сразу к конечной "формуле" пртензии предъявляете ?
6 авг 15, 13:59    [17983970]     Ответить | Цитировать Сообщить модератору
 Re: Case sensitive compare 2 strings  [new]
Anatoliy
Member

Откуда: Kiev
Сообщений: 100
Да получилось!

DECLARE @First NVARCHAR(MAX) 
DECLARE @Second NVARCHAR(MAX) 
SELECT @First = N'Ы', @Second = N'ы' 

 IF (@First = @Second COLLATE SQL_Latin1_General_CP1_CS_AS)
	select 'Equal'
ELSE
	select 'Different'

Я тут путал вас не специально! Так что вы уж извините, если некорректно задавал вопросы, вставлял пробелы, где не надо. Но в конечном счете результата добился.

К сообщению приложен файл. Размер - 5Kb
6 авг 15, 14:10    [17984086]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить