Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 глюк при сравнении строк  [new]
ikv_2006
Member

Откуда:
Сообщений: 47
Хотя код символа "-" меньше, чем код "0", но при сравнении строк "01" и "-1", последняя оказывается больше:
select '"0" > "-"' r
where (char(48)) > (char(45))
union
select '"01" < "-1"' r
where (char(48)+'1') < (char(45)+'1')


На других строках такой странности не замечал.
Кто с таким глюком сталкивался?
Может это какими-то настройками лечится?
23 июл 13, 14:42    [14604488]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
ikv_2006,

COLLATION
23 июл 13, 14:43    [14604497]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
ikv_2006
Member

Откуда:
Сообщений: 47
iap, Collation у базы — Cyrillic_General_CI_AS
Хотя сомнительно, что он может повлиять. Ведь все используемые в запросе символы — одинаковые для любой кодировки
23 июл 13, 14:51    [14604567]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ikv_2006
Хотя сомнительно, что он может повлиять

Не извольте сомневаться:
select '0'  collate Cyrillic_General_CI_AS union all
select '-'  collate Cyrillic_General_CI_AS union all
select '01' collate Cyrillic_General_CI_AS union all
select '-1' collate Cyrillic_General_CI_AS
order by 1
/* Результат:
-
0
01
-1
*/

select '0'  collate Latin1_General_Bin union all
select '-'  collate Latin1_General_Bin union all
select '01' collate Latin1_General_Bin union all
select '-1' collate Latin1_General_Bin
order by 1
/* Результат:
-
-1
0
01
*/
23 июл 13, 14:55    [14604590]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ikv_2006
Хотя код символа меньше... но при сравнении строк ...

"Если код символа меньше, то и сам символ меньше" — это верно для бинарных параметров сортировки. В общем случае это не верно.
23 июл 13, 14:56    [14604604]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
ikv_2006
Member

Откуда:
Сообщений: 47
Гость333,
а как это можно объяснить?
ведь у кириллической кодировки первая половина не отличается от стандартной.

И как быть если в строке намешаны и цифровые символы и кириллические?
23 июл 13, 15:01    [14604637]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
ikv_2006,

COLLATE - это не только символы, но и правила сортировки.
И для именно этого COLLATE они такие.

Смутно припоминаю, что это уже не первый раз выскакивает на форуме...
23 июл 13, 15:10    [14604700]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
ikv_2006
iap, Collation у базы — Cyrillic_General_CI_AS
Хотя сомнительно, что он может повлиять. Ведь все используемые в запросе символы — одинаковые для любой кодировки
То есть, Вы неправильно понимаете COLLATE как "кодировку".
На самом деле ничего общего.
23 июл 13, 15:11    [14604712]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap
То есть, Вы неправильно понимаете COLLATE как "кодировку".
На самом деле ничего общего.

Кстати, да.
Кодировка — это code page.
Collation — это "параметры сортировки".
23 июл 13, 15:19    [14604743]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
ikv_2006
Member

Откуда:
Сообщений: 47
ага, ясно
спасибо
23 июл 13, 15:26    [14604801]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
ikv_2006
Member

Откуда:
Сообщений: 47
iap,
влияние collation'а на алфавитные символы понятно и соответствует языку и суффиксам, указанным в его названии.
А вот влияние на символы, не относящиеся к алфавитным, — неожиданно и, хуже того, непредсказуемо. Вот сейчас обнаружилась особенность с символом «-». Но наверняка ведь, что таких «подводных камней» там немало. Хотелось бы представлять, что там ещё есть.

Где бы прочитать, как именно работает тот или иной collation? Типа списков правил, «зашитых» в collation'ы.
Полазил по msdn'у, другие источники порыл. Но пока ничего толкового не нашёл.
24 июл 13, 01:06    [14607718]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
ikv_2006
Где бы прочитать, как именно работает тот или иной collation? Типа списков правил, «зашитых» в collation'ы.
Полазил по msdn'у, другие источники порыл. Но пока ничего толкового не нашёл.
Я тоже!
24 июл 13, 09:37    [14608296]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
вроде вот
24 июл 13, 10:38    [14608772]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
ambarka_max
вроде вот
А как тут понять, что '0'>'-', но '01'<'-1'?
24 июл 13, 10:54    [14608862]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
ikv_2006
Где бы прочитать, как именно работает тот или иной collation?


Разве нельзя сделать так?

create table #testtable (number int, chr char(1) collate cyrillic_general_ci_as);

insert into #testtable (number, chr)
select number, CHAR(number)
  from master..spt_values 
 where type = 'P'
   and number between 0 and 255;
  
  
select * from #testtable
 order by chr;
  
drop table #testtable;


Или я чего-то не понимаю?
24 июл 13, 10:57    [14608884]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Minamoto
ikv_2006
Где бы прочитать, как именно работает тот или иной collation?


Разве нельзя сделать так?

create table #testtable (number int, chr char(1) collate cyrillic_general_ci_as);

insert into #testtable (number, chr)
select number, CHAR(number)
  from master..spt_values 
 where type = 'P'
   and number between 0 and 255;
  
  
select * from #testtable
 order by chr;
  
drop table #testtable;



Или я чего-то не понимаю?
Не понимаете. См. выше, как говорится!
Это Вы для одиночных символов смотрите.
А для пар символов по-другому получается!
Что по этому поводу скажете?
24 июл 13, 11:02    [14608907]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
iap
Не понимаете. См. выше, как говорится!
Это Вы для одиночных символов смотрите.
А для пар символов по-другому получается!
Что по этому поводу скажете?

может это http://collation-charts.org/help.html
смотрите, там квадратики обрамленные точечками обозваны Ignorable - a character doesn't have weights on the primary level (but may have weights on the secondary or the tertiary, or the higher levels). Often, punctuation characters are ignorable.
То есть это не пары а лидирующие символы.
24 июл 13, 11:11    [14608954]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Вроде все сходиться
24 июл 13, 11:14    [14608974]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
ambarka_max,

'-' просто всегда выбрасывается, да?

'-'<'0' просто потому, что сравнивается пустая строка со строкой длиной 1 символ.
'-1'>'01', так как на самом деле сравниваются '1' и '01', а '1'>'0'
24 июл 13, 11:25    [14609041]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Жалко, что нельзя получить свойство "игнорируемости" символа.
24 июл 13, 11:26    [14609050]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
iap
ambarka_max,

'-' просто всегда выбрасывается, да?

'-'<'0' просто потому, что сравнивается пустая строка со строкой длиной 1 символ.
'-1'>'01', так как на самом деле сравниваются '1' и '01', а '1'>'0'
как я понял из хелпа, он выбрасывается при первом проходе сортировки, при втором используется для определения, как сортировать строки.

Проверил на примере: строка '1' и '-1' не равны, но при этом вторая следует за первой (сортировка второго уровня), а не за строкой '-'.

create table #testtable (number int, val char(2) collate Cyrillic_General_CI_AS)
insert into #testtable
select 1 as number, '0' collate Cyrillic_General_CI_AS as val union all
select 2, '-'  collate Cyrillic_General_CI_AS union all
select 3, '+'  collate Cyrillic_General_CI_AS union all
select 4, '01' collate Cyrillic_General_CI_AS union all
select 5, '-1' collate Cyrillic_General_CI_AS union all
select 6, '+1' collate Cyrillic_General_CI_AS union all
select 7, '1' collate Cyrillic_General_CI_AS

select *
  from #testtable t1
 order by t1.val;

select *
  from #testtable t1
       cross join #testtable t2
 where t2.val = t1.val
 and t1.number > t2.number
 order by t1.val;
  
drop table #testtable;
24 июл 13, 11:37    [14609155]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
iap
Жалко, что нельзя получить свойство "игнорируемости" символа.

Это нужно просто запомнить :) Апостроф и минус игнорируются при первой сортировке, но используются для сортировки второго уровня внутри группы одинаковых при первой сортировке.
24 июл 13, 11:40    [14609176]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
я не понимаю почему вот тут
select s
	, cast(ascii(s) as binary(1)) as ch1
from (
	select '-' collate Cyrillic_General_CI_AS s union all
	select ' ' collate Cyrillic_General_CI_AS union all
	select '!' collate Cyrillic_General_CI_AS
) t
order by 1

пробел выше минуса, хотя тут явно видно, что "!" и пробел из одной группы, и они должны оба быть вместе, а между ними затесался минус.
24 июл 13, 11:56    [14609295]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
ambarka_max
я не понимаю почему вот тут
select s
	, cast(ascii(s) as binary(1)) as ch1
from (
	select '-' collate Cyrillic_General_CI_AS s union all
	select ' ' collate Cyrillic_General_CI_AS union all
	select '!' collate Cyrillic_General_CI_AS
) t
order by 1

пробел выше минуса, хотя тут явно видно, что "!" и пробел из одной группы, и они должны оба быть вместе, а между ними затесался минус.

Подкину еще материал для размышления - почему пустой символ идет после пробела ;)

select s
	, cast(ascii(s) as binary(1)) as ch1
from (
	select '-' collate Cyrillic_General_CI_AS s union all
	select ' ' collate Cyrillic_General_CI_AS union all
	select '!' collate Cyrillic_General_CI_AS union all
	select '' collate Cyrillic_General_CI_AS
) t
order by 1
24 июл 13, 12:02    [14609348]     Ответить | Цитировать Сообщить модератору
 Re: глюк при сравнении строк  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
я умываю руки =)
24 июл 13, 12:04    [14609365]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить