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

Откуда: Ростов-на-Дону
Сообщений: 344
Здравствуйте,

Есть такая проблема с некоторыми символами некоторых языков - они как то криво отображаются. И записываются в БД.

Вот проблема с японскими символами. И надо бы какой нибудь Collation выбрать, который бы работал для таких разных языков как японский и русский и французский, ну и другие. В БД хранятся данные в NVARCHAR


WITH CTE AS 
(SELECT N'ま' AS d
UNION ALL
SELECT N'マ' AS D)
SELECT * FROM CTE WHERE D = N'マ'


create table dbo.TestCollation
(
	dirNameWIS NVARCHAR(255) COLLATE SQL_Latin1_General_CP1_CI_AS,
	dirNameWIS2 NVARCHAR(255) COLLATE Latin1_General_100_CI_AS,
	dirNameWS NVARCHAR(255) COLLATE Latin1_General_100_CI_AS_WS,
	dirNameJP NVARCHAR(255) COLLATE Japanese_XJIS_100_CI_AS_WS, 
	dirNameCyr NVARCHAR(255) COLLATE Cyrillic_General_100_CI_AS
)

Insert into TestCollation
(dirNameWIS,dirNameWIS2,dirNameWS,dirNameJP)
values ('ま','ま','ま','ま')

Insert into TestCollation
(dirNameWIS,dirNameWIS2,dirNameWS,dirNameJP)
values ('マ','マ','マ','マ')

Insert into TestCollation
(dirNameWIS,dirNameWIS2,dirNameWS,dirNameJP,dirNameCyr)
values ('Ё','Ё','Ё','Ё','Ё')

Insert into TestCollation
(dirNameWIS,dirNameWIS2,dirNameWS,dirNameJP,dirNameCyr)
values ('Щ','Щ','Щ','Щ','Щ')

SELECT * FROM TestCollation WHERE dirNameWIS = N'マ'
SELECT * FROM TestCollation WHERE dirNameWIS2 = N'マ'
SELECT * FROM TestCollation WHERE dirNameWS = N'マ'
SELECT * FROM TestCollation WHERE dirNameJP = N'マ'

select * from TestCollation


и у меня проблема уже теперь даже не в Collation. Я Это протестировать в БД не могу. Ну то есть из приложения все русские и японские символы сохраняются, а вот если я этими скриптами создаю - у меня вопросы.
В общем печаль и тлен.

После того как смогу протестить на стороне БД задача понять что будет подходить для хранения разных иероглифов в CTE - чтобы система понимала что они разные - Width Sensitive
24 мар 17, 16:59    [20330370]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
Nimua,

Ой... у меня в исходном варианте это выглядит вот так

http://joxi.ru/5mdvBMjSkJYXYA
24 мар 17, 17:01    [20330376]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
a_voronin
Member

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

если буковки N перед константами писать, то при вставке в NVARCHAR все должно быть пучком

Insert into TestCollation
(dirNameWIS,dirNameWIS2,dirNameWS,dirNameJP,dirNameCyr)
values (N'Щ',N'Щ',N'Щ',N'Щ',N'Щ')
24 мар 17, 17:02    [20330382]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
o-o
Guest
не надо постить картинки в виде ХУА.
их надо прикреплять к сообщениям.

не надо в юникод класть неюникодное добро.
и не надо юникодной колонке назначать разные коллэйшены: там все равно кодовая страница учитываться не будет,
а только лишь CI_AS_WS
24 мар 17, 17:06    [20330395]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
o-o,

Спасибо! Совсем туплю.
А теперь вопрос:

Почему при выборке из
24 мар 17, 17:11    [20330408]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
Из поля с Collation

Latin1_General_100_CI_AS_WS

для разных иероглифов, ожидая Width Sensitive я получаю обе строки - вместо того чтобы была одна

create table dbo.TestCollation
(
	dirNameWIS NVARCHAR(255) COLLATE SQL_Latin1_General_CP1_CI_AS,
	dirNameWIS2 NVARCHAR(255) COLLATE Latin1_General_100_CI_AS,
	dirNameWS NVARCHAR(255) COLLATE Latin1_General_100_CI_AS_WS,
	dirNameJP NVARCHAR(255) COLLATE Japanese_XJIS_100_CI_AS_WS, 
	dirNameCyr NVARCHAR(255) COLLATE Cyrillic_General_100_CI_AS
)

Insert into TestCollation
(dirNameWIS,dirNameWIS2,dirNameWS,dirNameJP)
values (N'ま',N'ま',N'ま',N'ま')

Insert into TestCollation
(dirNameWIS,dirNameWIS2,dirNameWS,dirNameJP)
values (N'マ',N'マ',N'マ',N'マ')

SELECT * FROM TestCollation WHERE dirNameWS = N'マ'


И второй вопрос. Как опубликовать эти символы на форум, чтобы они не менялись на вопросы или код символа?
24 мар 17, 17:14    [20330418]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
o-o,

Вот собственно кейс

К сообщению приложен файл. Размер - 148Kb
24 мар 17, 17:18    [20330429]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
o-o
Guest
неяпонского примера нет случайно?
я мало, что его(японский) не знаю
(и мне даже нЕкого спросить, вот те 2 иероглифа они хоть как-то могут быть равны или нет)
я вот это вот WS не знаю, как устроено.
т.е. не знаю, что оно уравнивает, а что нет
24 мар 17, 17:43    [20330529]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
o-o
Guest
если примеры из других языков есть, давайте сюда, будем разбираться.
если нет, оно и к лучшему: выставьте колонке японский нужный коллэйшен,
а остальным на него будет все равно
24 мар 17, 17:44    [20330534]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
o-o,

https://blog.sqlauthority.com/2012/07/14/sql-server-example-of-width-sensitive-and-width-insensitive-collation/

Вообще проблема у клиентов с японским, но есть подозрение что не только.
Вот тут есть пример с широким текстом

create table dbo.TestCollation
(
	dirNameWIS NVARCHAR(255) COLLATE SQL_Latin1_General_CP1_CI_AS,
	dirNameWIS2 NVARCHAR(255) COLLATE Latin1_General_100_CI_AS,
	dirNameWS NVARCHAR(255) COLLATE Latin1_General_100_CS_AS_WS
)

Insert into TestCollation
(dirNameWIS,dirNameWIS2,dirNameWS,dirNameJP)
values (N'text',N'text',N'text',N'text')

Insert into TestCollation
(dirNameWIS,dirNameWIS2,dirNameWS,dirNameJP)
values (N'text',N'text',N'text',N'text')


SELECT * FROM TestCollation WHERE dirNameWIS = N'text'
SELECT * FROM TestCollation WHERE dirNameWS = N'text'


Для этого текста работает, а вот для японского не работает так как я ожидала. Поэтому по идее смена collation на width sensitive решит проблему с таким текстом. но не я с японским
24 мар 17, 17:53    [20330570]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
Эх

вот что было в оригинале

К сообщению приложен файл. Размер - 149Kb
24 мар 17, 17:54    [20330573]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
o-o,

то есть поставить Collation японский чтобы работало сравнение для этих иероглифов корректно и все?

Еще вопрос.. у меня клиентов много, а таких случаев мало... но я подозреваю переделывать все равно придется. Вдруг японцев станет больше :)
24 мар 17, 17:56    [20330581]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
o-o
Guest
у японцев вроде еще какое-то KS есть,
можно с ним попробовать
24 мар 17, 17:57    [20330584]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
o-o
Guest
Nimua
то есть поставить Collation японский чтобы работало сравнение для этих иероглифов корректно и все?

да, чтобы решить проблемы тех, у кого они есть.
я так понимаю, только у японцев что-то не то?
24 мар 17, 18:06    [20330602]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
Владислав Колосов
Member

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

Дык какие проблемы, коллейшн базы - это всего лишь дефлтное значение для строк. Если при строковых операциях Вы укажете коллейшн в запросе явно, то сервер поймет, как их сравнивать. Разумеется, строки надо хранить в юникоде.
25 мар 17, 16:48    [20332178]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8584
автор
вот если я этими скриптами создаю - у меня вопросы

Как раз по причине, о которой я выше написал.
Смотрите внимательно справку по синтаксису операций.
25 мар 17, 16:50    [20332181]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
o-o
Guest
Владислав Колосов
коллейшн базы - это всего лишь дефлтное значение для строк


это наверное вот так?

К сообщению приложен файл. Размер - 6Kb
25 мар 17, 23:19    [20332875]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
Корректное сравнение получается при использовании
Collation Japanese_Bushu_Kakusu_100_CI_AS_KS_WS

Теперь еще вопрос - везде пишется про то, что если менять Collation то лучше сразу везде в БД. Этого очень не хочется делать на проде. Я бы поменяла только на этой колонке, которая хранит эти данные от пользователя. Так как в случае с юникодом collation влияет только на фильтрацию и сравнение, а не на само хранение данных.
Есть минусы у такого решения?
27 мар 17, 15:58    [20337571]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
o-o
Guest
Nimua
Так как в случае с юникодом collation влияет только на фильтрацию и сравнение, а не на само хранение данных.
Есть минусы у такого решения?

сравнение такой колонки с любой другой юникодной же колонкой,
но с другим коллэйшеном не пройдет, пока не будет явно указан коллэйшен,
к которому другая колонка приводится
-----------------------------------------------
это еще что.
у меня создалась таблица с таким вот коллэйшеном (cм. св-ва колонки на скрине),
но при приведении к нему другой колонки мне выдали:
Msg 0, Level 11, State 0, Line 0
The Collation specified by SQL Server is not supported.

номер ошибки впечатляет.
логика тоже: как колонку создавать, так она такой коллэйшен поддерживает,
а как к нему привести другую колонку, так уже не поддерживает

К сообщению приложен файл. Размер - 33Kb
27 мар 17, 16:31    [20337792]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
o-o,

Странно. У меня работает. Версия Microsoft SQL Server 2012 (SP3-CU6-GDR) (KB3194724) - 11.0.6567.0 (X64)

select * from TestCollation WHERE dirNameWS COLLATE Japanese_Bushu_Kakusu_100_CI_AS_KS_WS = N'ま'
27 мар 17, 18:07    [20338139]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
Ух ты! Символ отобразился правильно.
27 мар 17, 18:08    [20338144]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
o-o
Guest
У меня в опыте участвовал 2008 R2 SP3
27 мар 17, 18:18    [20338156]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
Нашла вот такие статьи

http://weblogs.sqlteam.com/dang/archive/2009/07/26/Collation-Hell-Part-1.aspx
http://weblogs.sqlteam.com/dang/archive/2009/08/16/Collation-Hell-Part-2.aspx
http://weblogs.sqlteam.com/dang/archive/2009/11/29/Collation-Hell-Part-3.aspx

И там дан вот такой милый пример. Удивляющий меня до предела.

--returns both 'Schröder' and 'Schroeder'
DECLARE @Foo TABLE(
      LastName nvarchar(10) COLLATE German_PhoneBook_CI_AS);
INSERT INTO @Foo VALUES(N'Schröder');
INSERT INTO @Foo VALUES(N'Schroeder');
SELECT LastName FROM @Foo
WHERE LastName LIKE N'%oe%';
GO
--returns only 'Schroeder'
DECLARE @Foo TABLE(
      LastName nvarchar(10) COLLATE Latin1_General_CI_AS);
INSERT INTO @Foo VALUES(N'Schröder');
INSERT INTO @Foo VALUES(N'Schroeder');
SELECT LastName FROM @Foo
WHERE LastName LIKE N'%oe%';
GO


К сообщению приложен файл. Размер - 136Kb
27 мар 17, 18:57    [20338226]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
o-o
Guest
Умлаут (диакритический знак)

К сообщению приложен файл. Размер - 76Kb
27 мар 17, 20:32    [20338404]     Ответить | Цитировать Сообщить модератору
 Re: Смотрю в книгу вижу... или Collation когда в БД разные языки  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
С помощью можно выбрать все поддерживаемые Collation

SELECT name, description FROM sys.fn_helpcollations();   


и среди поддерживаемых была найдена
28 мар 17, 12:55    [20340984]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить