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

Откуда:
Сообщений: 424
Можно ли управлять кодировкой содержимого текстового поля?
Т.е. когда создаю таблицу, могу ли я как-то влиять на кодировку?
12 мар 15, 17:37    [17377042]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
Glory
Member

Откуда:
Сообщений: 104751
leonix
Можно ли управлять кодировкой содержимого текстового поля?
Т.е. когда создаю таблицу, могу ли я как-то влиять на кодировку?

Вы можете занести в текстовое поле любое нужное вам значение.
Серверу все равно, какой смысл вы вкладываете в содержимое поле.
12 мар 15, 17:39    [17377059]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
leonix
Member

Откуда:
Сообщений: 424
ок. Подскажите тогда, есть поле типа nvarchar(255). Как узнать в какой кодировке там лежит текст?
13 мар 15, 08:58    [17378807]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
aleks2
Guest
leonix
ок. Подскажите тогда, есть поле типа nvarchar(255). Как узнать в какой кодировке там лежит текст?


nvarchar = UNICODE.

Для этого зверя понятия "кодировка" ишо не придумали.
13 мар 15, 09:17    [17378885]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
Glory
Member

Откуда:
Сообщений: 104751
leonix
Как узнать в какой кодировке там лежит текст?

В той, в которой вы его туда положили
13 мар 15, 09:31    [17378957]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
aleks2
Guest
Glory
leonix
Как узнать в какой кодировке там лежит текст?

В той, в которой вы его туда положили


С этого места подробнее!
13 мар 15, 09:42    [17379001]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
Glory
Member

Откуда:
Сообщений: 104751
aleks2
Glory
пропущено...

В той, в которой вы его туда положили


С этого места подробнее!

О чем ? Что клиент указал занести в поле таблицы, то там и будет
13 мар 15, 09:45    [17379021]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
leonix
Member

Откуда:
Сообщений: 424
aleks2
leonix
ок. Подскажите тогда, есть поле типа nvarchar(255). Как узнать в какой кодировке там лежит текст?


nvarchar = UNICODE.

Для этого зверя понятия "кодировка" ишо не придумали.


ОК. А если другой тип (varchar), то какая кодировка будет?
13 мар 15, 10:18    [17379181]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
aleks2
Guest
leonix
aleks2
пропущено...


nvarchar = UNICODE.

Для этого зверя понятия "кодировка" ишо не придумали.


ОК. А если другой тип (varchar), то какая кодировка будет?


Последовательность 8-битных чисел вы вольны трактовать как ЛЮБУЮ кодовую страницу.
MS SQL не хранит кодовую страницу и не знает ничего об этом.
13 мар 15, 10:24    [17379200]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
o-o
Guest
aleks2
MS SQL не хранит кодовую страницу и не знает ничего об этом.

ну вообще-то хранит.
коллэйшены же не только ценный мех правила сортировки,
но и кодовая страница тоже.
в именах SQL-коллэйшенов она даже указывается (хоть и есть исключения).
в моем примере я заношу абсолютно одинаковую последовательность символов их кодами,
т.е. без намека на кодовую страницу, но в колонках указываю соответствующий коллэйшен.
вот результат:

К сообщению приложен файл. Размер - 42Kb
13 мар 15, 11:05    [17379382]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
o-o
Guest
простите, картинка не та,
то было для получения в бинарном виде, теперь все ок
(вопросы -- это он уже перекодировал, нам это не надо)
13 мар 15, 11:11    [17379403]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
o-o
Guest


К сообщению приложен файл. Размер - 42Kb
13 мар 15, 11:11    [17379408]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
aleks2
Guest
o-o
aleks2
MS SQL не хранит кодовую страницу и не знает ничего об этом.

ну вообще-то хранит.
коллэйшены же не только ценный мех правила сортировки,
но и кодовая страница тоже.
в именах SQL-коллэйшенов она даже указывается (хоть и есть исключения).
в моем примере я заношу абсолютно одинаковую последовательность символов их кодами,
т.е. без намека на кодовую страницу, но в колонках указываю соответствующий коллэйшен.
вот результат:


1. Это как-то препятствует мне указать любой другой коллэйшен?
2. Это ваш клиент отображает "хрен знает что", а сервер ему все байтики передал "как есть".
13 мар 15, 11:17    [17379428]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
Glory
Member

Откуда:
Сообщений: 104751
o-o
ну вообще-то хранит.

Сервер _не хранит_ кодовую страницу клиента
Соответствие кодовой странице какому то коллейту не есть хранение этой кодовой странице в поле таблицы
13 мар 15, 11:21    [17379460]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
o-o
Guest
aleks2
1. Это как-то препятствует мне указать любой другой коллэйшен?

да, препятствует.
нужно хорошо извратиться, чтобы вынуть теперь кириллицу из колонки
с насильно указанным латинским коллэйшеном,
или покажите, как же это просто указанием коллейшена получится
(см. картинку ниже)
aleks2
2. Это ваш клиент отображает "хрен знает что", а сервер ему все байтики передал "как есть".

ну, у вас клиент несомненно круче,
покажите, что как он отобразит честно переданные байтики, сложенные в столбец с 1252

К сообщению приложен файл. Размер - 43Kb
13 мар 15, 11:27    [17379499]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
aleks2
Guest
o-o
aleks2
1. Это как-то препятствует мне указать любой другой коллэйшен?

да, препятствует.
нужно хорошо извратиться, чтобы вынуть теперь кириллицу из колонки


cast(str as varbinary). Чего тут сложного?
13 мар 15, 11:30    [17379527]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
aleks2
Guest
Кстати, проблема там не с извлечением, а с запихиванием.

declare @t table(a varchar(100) collate Latin1_General_CI_AS, b varchar(100) collate Cyrillic_General_CI_AS )

insert @t values('abc кириллица', 'кириллица')

select *, cast(a as varbinary(100)), cast(b as varbinary(100)) from @t
13 мар 15, 11:41    [17379594]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
o-o
Guest
aleks2
cast(str as varbinary). Чего тут сложного?

действительно,
да и вообще, зачем какие-то строковые поля придумали, надо сразу все в binary хранить.
вот и храните.
на ЖБИ тоже можно через Уралмаш доехать.

где ответ на ваш же вопрос
aleks2
Это как-то препятствует мне указать любой другой коллэйшен?

укажите коллэйшен и получите обратно кириллицу, без перевода в binary

я приветствую ваши красивые решения, когда они есть,
но вот голословно прокричать и слиться/не ответить на прямой вопрос -- ваш конек.
кстати, вас случайно не Васей звать?
напоминаете кое-кого :)

Collations and Code Pages
The code page for a (var)char value determines the mapping between characters and the byte representation that is stored in the table. For example, with the Windows Latin 1 code page (1252; the SQL Server default), the character 'a' corresponds to the byte 0x61.

The code page of a (var)char value is determined by the collation associated with the value. For example, the collation SQL_Latin1_General_CP1_CI_AS has the associated code page 1252.

The collation of a value is either inherited from the database collation, or can be specified explicitly using the COLLATE keyword. Database collation cannot be changed if the database contains memory-optimized tables or natively compiled stored procedures. The following example sets the database collation and creates a table, which has a column with a different collation. The database uses Latin case-insensitive collation.
13 мар 15, 11:41    [17379601]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
o-o
Guest
aleks2
Кстати, проблема там не с извлечением, а с запихиванием.

declare @t table(a varchar(100) collate Latin1_General_CI_AS, b varchar(100) collate Cyrillic_General_CI_AS )

insert @t values('abc кириллица', 'кириллица')

select *, cast(a as varbinary(100)), cast(b as varbinary(100)) from @t

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

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

строковые данные завязаны на коллэйшен, если они не в юникоде,
binary отвязано, но вопрос ТС не про binary
13 мар 15, 11:48    [17379654]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
Glory
Member

Откуда:
Сообщений: 104751
o-o
действительно,
да и вообще, зачем какие-то строковые поля придумали, надо сразу все в binary хранить.
вот и храните.

А что сервер уже отвечает за отображение ?
Вы занесли данные в таблицу в бинарном виде, а отбражения требуете в символьном.

o-o
укажите коллэйшен и получите обратно кириллицу, без перевода в binary

получить где ? в гриде клиентского приложения ?

o-o
The code page of a (var)char value is determined by the collation associated with the value.

is determined == stored in table ?
13 мар 15, 11:53    [17379706]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
o-o
Guest
Glory
o-o
действительно,
да и вообще, зачем какие-то строковые поля придумали, надо сразу все в binary хранить.
вот и храните.

А что сервер уже отвечает за отображение ?
Вы занесли данные в таблицу в бинарном виде, а отбражения требуете в символьном.

вы тему с самого начала читаете, уверены?
я символьные данные в строковых полях храню,
и заношу в строковом же виде.
про binary -- не ко мне, к , пожалуйста.
у меня первая картинка как раз автоматом получилась,
я-то юникодом занесу и кириллицу тоже,
но только вот в столбец с латинским коллэйшеном она не ляжет,
только вопросики, а мне надо было убедить алекса,
что даже если и удастся занести кириллицу без потерь в неюникодную 1252-колонку,
то обратно все равно кириллицу только с плясками получите.
некрасиво из контекста выдирать.

а еще хочу спросить алекса, как же быть с индексами.
как искать кириллицу в неюникодной 1252-колонке.
тоже в binary переводить, да?
13 мар 15, 12:11    [17379836]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
aleks2
Guest
o-o
а еще хочу спросить алекса, как же быть с индексами.
как искать кириллицу в неюникодной 1252-колонке.
тоже в binary переводить, да?

Гм? Разве тут было про поиск и прочия?
13 мар 15, 12:16    [17379873]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
Glory
Member

Откуда:
Сообщений: 104751
o-o
вы тему с самого начала читаете, уверены?

Я - читаю

o-o
я символьные данные в строковых полях храню,
и заношу в строковом же виде.
про binary -- не ко мне, к , пожалуйста.

17379408 - т.е. это не вы ?

o-o
но только вот в столбец с латинским коллэйшеном она не ляжет,

Она - ляжет. Просто клиент передаст серверу не то, что вы напечатали в окне запроса. И сервер положит в таблицу то, что получит. И вернет вам то, что там лежит.
13 мар 15, 12:17    [17379881]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
o-o
Guest
Glory
is determined == stored in table ?

то ж блин еще один стрелочник-подменятель исходных формулировок.
ну давайте восстановим ход событий.
алекс2 утверждает
aleks2
MS SQL не хранит кодовую страницу и не знает ничего об этом.

вот на это его "не знает ничего" и был мой ответ:
o-o
aleks2
MS SQL не хранит кодовую страницу и не знает ничего об этом.

ну вообще-то хранит.

знает о кодовой странице ровно то, что ему сообщили.
и считает, что там лежат символы этой кодовой страницы.
вот потому при вставке неюникода он перекодирует и получает вопросики,
т.е. берет он символы, считая, что они из кодовой страницы,
к-ая заложена в коллэйшене базы, в контексте к-ой выполнялся код, заносящий символы.
ищет точку входа юникода и уже по ней ищет код символа в странице,
к-ая заложена в коллэйшене столбца, куда вставляем.
и информацию о кодовой странице знает и хранит в метаданных столбца
13 мар 15, 12:20    [17379900]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли управлять кодировкой содержимого текстового поля?  [new]
o-o
Guest
Glory
Она - ляжет. Просто клиент передаст серверу не то, что вы напечатали в окне запроса. И сервер положит в таблицу то, что получит. И вернет вам то, что там лежит.

если вопросики, это "она", т.е. кириллица, то извините, с вами спорить больше не о чем
13 мар 15, 12:22    [17379909]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить