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

Откуда:
Сообщений: 1
Можно ли как-то штатными средствами / просто сделать что-то типа уникального индекса на строку, но без учета регистра.

Вообще, в столбце предполагается хранить уникальные латинские названия, типа: admin, user, domain

И чтобы при существовании записи со значением "admin" не давало вставить "aDmin"?
7 окт 13, 16:05    [14934787]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
fl_user, у столбца с уникальным констрейнтом или индексом должен быть регистроНЕчувствительный коллейшн, типа collate cyrillic_general_ci_as
7 окт 13, 16:11    [14934846]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
CREATE TABLE dbo.A (Name VarChar(256)  COLLATE Cyrillic_General_CI_AI PRIMARY KEY)
CREATE TABLE dbo.B (Name VarChar(256)  COLLATE Cyrillic_General_CS_AI PRIMARY KEY)

INSERT dbo.A VALUES ('Admin')
INSERT dbo.A VALUES ('admin')

INSERT dbo.B VALUES ('Admin')
INSERT dbo.B VALUES ('admin')

SELECT * FROM dbo.A
SELECT * FROM dbo.B
7 окт 13, 16:12    [14934859]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Гость333
Member

Откуда:
Сообщений: 3683
fl_user
без учета регистра

Учитывать регистр или нет, задаётся в параметрах сортировки столбца (collation).
7 окт 13, 16:13    [14934864]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
Простите что поднимаю старую ветку, но вопрос аналогичный.
Проблема в том, что у меня поля - nvarchar.
Возможно ли индексу сказать что он регистроНЕзависимый.
Что то типа - General_BIN как collation существует?

Как вариант иметь два доп поля и в них хранить значения в одном только регистре.

Вариант с View и индексом на нем, не очень красивый.

MS SQL 2008 R2, MS SQL 2012
8 июл 14, 10:26    [16273404]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volochkova
Что то типа - General_BIN как collation существует?

select * from fn_helpcollations()
8 июл 14, 10:30    [16273440]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
invm
Member

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

declare @t table (id int primary key, s_cs nvarchar(100) collate Cyrillic_General_CS_AI, s_ci as s_cs collate Cyrillic_General_CI_AI, unique(s_ci));

insert into @t values (1, 'admin');
insert into @t values (2, 'Admin');
8 июл 14, 10:38    [16273501]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
Glory
Volochkova
Что то типа - General_BIN как collation существует?

select * from fn_helpcollations()


Как среди 3885 строк выбрать ту, которая отражает Юникод, но без конкретного языка?

invm
Volochkova,

declare @t table (id int primary key, s_cs nvarchar(100) collate Cyrillic_General_CS_AI, s_ci as s_cs collate Cyrillic_General_CI_AI, unique(s_ci));

insert into @t values (1, 'admin');
insert into @t values (2, 'Admin');


У меня могут быть другие символы aérien, tâche и т.д.
Про немецкий я вообще молчу :-)
8 июл 14, 13:46    [16275060]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volochkova
Как среди 3885 строк выбрать ту, которая отражает Юникод, но без конкретного языка?

Что ?
Вы спрашивали, какие имена коллейтов имеются.
А юникод - он и в Африке юникод
8 июл 14, 13:48    [16275076]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
Volochkova
У меня могут быть другие символы aérien, tâche и т.д.
И? Что это меняет?
8 июл 14, 14:03    [16275232]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
Glory
Volochkova
Как среди 3885 строк выбрать ту, которая отражает Юникод, но без конкретного языка?

Что ?
Вы спрашивали, какие имена коллейтов имеются.
А юникод - он и в Африке юникод


Т.е для COLLATE Cyrillic_General_CI_AS 'a' и 'â' - не одно и тоже?
Хорошо, а значит для Юникода без разницы Croatian_General_CI_AS или Cyrillic_General_CI_AS ?
8 июл 14, 14:04    [16275244]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volochkova
Т.е для COLLATE Cyrillic_General_CI_AS 'a' и 'â' - не одно и тоже?

В смысле ? Вы про код символа ? Или про визуализацию этого кода в клиентском приложении ?
8 июл 14, 14:07    [16275277]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
CREATE TABLE #A (Name NVarChar(256)  COLLATE Cyrillic_General_CI_AI PRIMARY KEY)

INSERT INTO #A VALUES (N'a')
INSERT INTO #A VALUES (N'â')

SELECT * FROM #A


Получаю ошибку Сообщение 2627, уровень 14, состояние 1, строка 4
Нарушено "PK__#A________737584F73694AD9D" ограничения PRIMARY KEY. Не удается вставить повторяющийся ключ в объект "dbo.#A". Повторяющееся значение ключа: (â).
8 июл 14, 14:08    [16275279]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
Пардон

CREATE TABLE #A (Name NVarChar(256)  COLLATE cyrillic_general_ci_as PRIMARY KEY)

INSERT INTO #A VALUES (N'a')
INSERT INTO #A VALUES (N'â')

SELECT * FROM #A

DROP TABLE #A 


Все работает.
Но тогда не ясно в чем отличие Latin1_General_CI_AS VS Cyrillic_General_CI_ASдля Юникода
8 июл 14, 14:14    [16275326]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Glory
Member

Откуда:
Сообщений: 104751
CREATE TABLE #A (Name NVarChar(256) COLLATE Cyrillic_General_Bin PRIMARY KEY)
или
Latvian_BIN
или
Arabic_100_BIN
или любой из
SELECT Name, Description FROM fn_helpcollations()
WHERE Description LIKE '% binary sort';
8 июл 14, 14:14    [16275330]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volochkova
Но тогда не ясно в чем отличие Latin1_General_CI_AS VS Cyrillic_General_CI_ASдля Юникода

коллейт - это правила сортировки, например
А не правила хранения данных
8 июл 14, 14:15    [16275337]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
Glory
Volochkova
Но тогда не ясно в чем отличие Latin1_General_CI_AS VS Cyrillic_General_CI_ASдля Юникода

коллейт - это правила сортировки, например
А не правила хранения данных


Т.е. для юникода отличие в сортировке для Latin1_General_CI_AS и Cyrillic_General_CI_AS не будет отличаться?

И тогда задам вопрос иначе.
Если необходимо хранить 'table' и 'Table' как уникальные значения - тогда как это сделать?
Уникальный индекс не даст этого сделать.
Т.е. можно 'table', 'TABLE' но только один раз.

Спасибо.
8 июл 14, 14:23    [16275381]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
Glory
Volochkova
Но тогда не ясно в чем отличие Latin1_General_CI_AS VS Cyrillic_General_CI_ASдля Юникода

коллейт - это правила сортировки, например
А не правила хранения данных

точнее сравнения!
8 июл 14, 14:23    [16275387]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
iap
Member

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

у Вас в одном случае _AS, а в другом - _AI
Знаете, что это значит?
Учитывать различие в диакретическом знаке или нет!
Что тут неправильного-то? В одном случае нарушение уникальности, в другом - нет.
8 июл 14, 14:27    [16275416]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Volochkova
Если необходимо хранить 'table' и 'Table' как уникальные значения - тогда как это сделать?
Если это юникодные строки, рекомендую COLLATE Cyrillic_General_BIN2
8 июл 14, 14:30    [16275436]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
Ivan Durak
Glory
пропущено...

коллейт - это правила сортировки, например
А не правила хранения данных

точнее сравнения!


Вот теперь точно все ясно.
CREATE TABLE #A (Name NVarChar(256)  COLLATE Cyrillic_General_BIN PRIMARY KEY)

INSERT INTO #A VALUES (N'a')
INSERT INTO #A VALUES (N'A')
INSERT INTO #A VALUES (N'â')
SELECT * FROM #A 
DROP TABLE #A 


Позволит хранить A и a.

CREATE TABLE #A (Name NVarChar(256) COLLATE cyrillic_general_ci_as PRIMARY KEY)

INSERT INTO #A VALUES (N'a')
INSERT INTO #A VALUES (N'â')

SELECT * FROM #A

DROP TABLE #A
Будет хранить уникальные значения даже для разных языков
8 июл 14, 14:33    [16275461]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volochkova
Т.е. для юникода отличие в сортировке для Latin1_General_CI_AS и Cyrillic_General_CI_AS не будет отличаться?

Для ответа на этот вопрос и надо узнать правила сравнения в каждом из коллейтов.
Потому существует больше символом, чем приведенные вами 'a' и 'â'
8 июл 14, 14:34    [16275473]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
Volochkova
Glory
пропущено...

коллейт - это правила сортировки, например
А не правила хранения данных


Т.е. для юникода отличие в сортировке для Latin1_General_CI_AS и Cyrillic_General_CI_AS не будет отличаться?
Спасибо.

будет. латин1 киррилические символы не по алфавиту сравнивает
8 июл 14, 14:35    [16275480]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
iap
Member

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

для юникода рекомендуется Cyrillic_General_BIN2, а не Cyrillic_General_BIN
8 июл 14, 14:36    [16275491]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный индекс на строку без учета регистра  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
iap
Volochkova,

для юникода рекомендуется Cyrillic_General_BIN2, а не Cyrillic_General_BIN


А в чем отличие, если не секрет?
Про то какой collation нужен, что бы индекс был "уникальным" становится более менее ясно .

CREATE TABLE #A (Name NVarChar(256)  COLLATE Latin1_General_CI_AS PRIMARY KEY)

INSERT INTO #A VALUES (N'a')
INSERT INTO #A VALUES (N'A')
INSERT INTO #A VALUES (N'â')

SELECT * FROM #A --Where Name= N'âтещ'

DROP TABLE #A 
CREATE TABLE #B (Name NVarChar(256)  COLLATE Cyrillic_General_BIN PRIMARY KEY)

INSERT INTO #B VALUES (N'a')
INSERT INTO #B VALUES (N'a')
INSERT INTO #B VALUES (N'A')
INSERT INTO #B VALUES (N'â')

SELECT * FROM #B --Where Name= N'âтещ'

DROP TABLE #B 


CREATE TABLE #C (Name NVarChar(256)  COLLATE Latin1_General_CI_AI PRIMARY KEY)

INSERT INTO #C VALUES (N'a')
INSERT INTO #C VALUES (N'A')
INSERT INTO #C VALUES (N'â')

SELECT * FROM #C --Where Name= N'âтещ'

DROP TABLE #C 
8 июл 14, 14:39    [16275525]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить