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

Откуда: г. Екатеринбург
Сообщений: 680
Добрый день.

Есть часть хранимых процедур, которые используются в работе с web сервером апач. Сам апач работая с внешними подключениями использует формат json, а там всегда UTF-8.

У нас получается, данные приходят на WEB сервер в UTF-8, затем часть из них, там где могут быть русские буквы, принудительно перекодируются в cp1251 и происходит вызов хранимой процедуры, куда передаются входящие данные.

вот пример одной из хранимых процедур:
CREATE PROCEDURE [CreateEventWithPassword]
  @AppID				NVARCHAR(152),
  @Password			NVARCHAR(4),
  @Name				NVARCHAR(100),
  @Phone				NVARCHAR(10),
  @Answer				INT = 0 OUTPUT,
  -- Описание ответа.
  @AnswerText			NVARCHAR(256) = '' OUTPUT
AS
..
..


например @AppID мы не перекодируем (т.к. там отсутствую русские буквы), а отправляет в sp, то что получили в формате UTF-8. А вот @Name нам приходится перекодировать т.к. там присутствую русские буквы, и если не перекодировать то в бд сохраняться "кракозябры".

Что касается возвращаемого параметра @AnswerText, которые получает WEB сервер из хранимки и отправляет обратно внешнему подключению, тут приходится принудительно перекодировать из cp1251 в UTF-8 иначе придут "кракозябры" внешнему подключению.


Уже замучились с этими перекодировками, очень часто возникают ошибки т.к. тот кто пишет интерфейс на WEB сервере - это одни люди, кто пишет sp другие люди.

У меня вопрос, можно ли в sp делать нужную перекодировку, чтоб её полностью исключить на стороне web сервера?
7 мар 17, 09:19    [20269602]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
aleks2
Guest
1. Перекодировку можно делать "где хошь".
2. Но правильно ее делать на web-сервере, ибо MS SQL не имеет встроенных возможностей "перекодировки".
3. Т.е. ваши горе-разработчики веба должны тупо и незатейливо перекодировать ВСЕ строки. Не задумываясь.
4. И будет те щастье.
7 мар 17, 09:26    [20269618]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
aleks2,

Ещё мистика такая. Если web сервер апач стоит под виндой, у нас всега это геморрой с перекодировкой. А тот, который под линуксом перекодировка наоборот лишняя. Хотя всё то же самое.
7 мар 17, 09:34    [20269643]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
И ещё вопрос

имеется ли возможность при создании хранимки указать, что такой-то параметр передан в cp1251?
7 мар 17, 09:43    [20269677]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Игорь_UUS
И ещё вопрос

имеется ли возможность при создании хранимки указать, что такой-то параметр передан в cp1251?

Разве что указывать явно Collation.
Но сам я так никогда не делал, скажу сразу.
7 мар 17, 09:49    [20269697]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
SQL2008
Игорь_UUS
И ещё вопрос

имеется ли возможность при создании хранимки указать, что такой-то параметр передан в cp1251?

Разве что указывать явно Collation.
Но сам я так никогда не делал, скажу сразу.


Это как можно попробовать?
7 мар 17, 10:01    [20269729]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Игорь_UUS,

collation это сортировка и сравнение, как это связано?????
7 мар 17, 10:03    [20269734]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Игорь_UUS
SQL2008
пропущено...

Разве что указывать явно Collation.
Но сам я так никогда не делал, скажу сразу.


Это как можно попробовать?

Приведите кусок кода, где производится вставка/обновление поля, в которое попадают "кракозябры".
7 мар 17, 10:17    [20269774]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
SQL2008,

INSERT INTO [table]
  ([Name])
VALUES
  (@Name)


везде таким образом
7 мар 17, 10:38    [20269848]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Игорь_UUS,
читайте первый ответ. Это не задачи БД
7 мар 17, 10:40    [20269856]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
TaPaK
Игорь_UUS,
читайте первый ответ. Это не задачи БД

Соглашусь с коллегой!
Затвра кодировку поменяют на 1252 и снова будете править код хранимки?
7 мар 17, 10:42    [20269864]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
o-o
Guest
SQL2008
Игорь_UUS
И ещё вопрос

имеется ли возможность при создании хранимки указать, что такой-то параметр передан в cp1251?

Разве что указывать явно Collation.
Но сам я так никогда не делал, скажу сразу.

в каком смысле "указывать", кому указывать?
если это надо процедуре указывать, ну заведите еще параметр и передавайте туда 1251,
процедура будет "знать", что ей передали 1251, и если вам надо сделать
из нее селект переданной кодовой страницы, пожалуйста, обратно отдатите эту строку, '1251'

если же вам надо, чтобы сервер автоматом менял коллэйшен базы, исходя из переданного в процедуру номера,
то вот этого не будет.
все строки ASCII при передаче сервер воспринимает ровно в той кодировке,
которая отражена в коллэйшене базы, в контексте которой выполняется процедура
7 мар 17, 10:44    [20269868]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
SQL2008,

Дело даже не в этом.

Нам сейчас приходится править код модулей php. Т.к. работаю на линуксе, перекодировка ненужна, работая под виндой перекодировка требуется. Даже в случае работы с одной и той же базой. Понять не можем в чём причина
7 мар 17, 10:45    [20269871]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
SQL2008,

автор
Затвра кодировку поменяют на 1252 и снова будете править код хранимки?
ладно, теперь и я хочу знать: как вы будете править код хп в зависимости от кодировки???
7 мар 17, 10:45    [20269873]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Игорь_UUS,

автор
Нам сейчас приходится править код модулей php. Т.к. работаю на линуксе, перекодировка ненужна, работая под виндой перекодировка требуется. Даже в случае работы с одной и той же базой. Понять не можем в чём причина

на этот вопрос более доходчиво любит отвечать aleks2 :)
7 мар 17, 10:47    [20269875]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
o-o
SQL2008
пропущено...

Разве что указывать явно Collation.
Но сам я так никогда не делал, скажу сразу.

в каком смысле "указывать", кому указывать?
если это надо процедуре указывать, ну заведите еще параметр и передавайте туда 1251,
процедура будет "знать", что ей передали 1251, и если вам надо сделать
из нее селект переданной кодовой страницы, пожалуйста, обратно отдатите эту строку, '1251'

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


Не могу понять, что можно попробовать переделать в хранимке для частоты эксперимента?
7 мар 17, 10:48    [20269881]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
TaPaK
Игорь_UUS,

автор
Нам сейчас приходится править код модулей php. Т.к. работаю на линуксе, перекодировка ненужна, работая под виндой перекодировка требуется. Даже в случае работы с одной и той же базой. Понять не можем в чём причина

на этот вопрос более доходчиво любит отвечать aleks2 :)


Если не сложно процитируйте "aleks2"... будем очень признательны, хотя бы понять "откуда ноги растут"
7 мар 17, 10:50    [20269886]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Игорь_UUS,

автор
Не могу понять, что можно попробовать переделать в хранимке для частоты эксперимента?

рядом с данными заводите поле хранящее код кодировки и клиентом соответственно конвертируете в зависимости от значения
7 мар 17, 10:50    [20269890]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Игорь_UUS
очень часто возникают ошибки т.к. тот кто пишет интерфейс на WEB сервере - это одни люди, кто пишет sp другие люди.
В чём собственно проблема?

Обе этих категории людей должны просто правильно писать код.

Сиквелу, что бы правильно работали операции сравнения и т.п., нужно, что бы данные передавались в юникоде, либо в какой то подходящей Windows-кодировке.

Вот так и надо делать.
7 мар 17, 11:05    [20269953]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Massa52
Member

Откуда:
Сообщений: 387
А может в бинарнике хранить?
Что дали - то и кладется в SQL.
Я как то в char(200) поле загонял бинарную последовательность из клиента.
Ну и считывал ее без проблем.
7 мар 17, 11:16    [20270031]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
alexeyvg
Игорь_UUS
очень часто возникают ошибки т.к. тот кто пишет интерфейс на WEB сервере - это одни люди, кто пишет sp другие люди.
В чём собственно проблема?

Обе этих категории людей должны просто правильно писать код.

Сиквелу, что бы правильно работали операции сравнения и т.п., нужно, что бы данные передавались в юникоде, либо в какой то подходящей Windows-кодировке.

Вот так и надо делать.


Загвоздка в том, что где-то надо делать перекодировку, а где то она не требуется. Голова "опухла", разобраться не можем
7 мар 17, 11:24    [20270111]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Игорь_UUS,

А вы параметры процедуры юникодовыми для красоты сделали?

1. Получили данные и перекодировали UTF8 -> UTF16
2. Вызвали ХП в соответствии с правилами указания юникодных литералов (префикс N)
3. Профит.
7 мар 17, 11:36    [20270200]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
invm
Игорь_UUS,

А вы параметры процедуры юникодовыми для красоты сделали?

1. Получили данные и перекодировали UTF8 -> UTF16
2. Вызвали ХП в соответствии с правилами указания юникодных литералов (префикс N)
3. Профит.


зачем делать интересно UTF8 -> UTF16?
7 мар 17, 12:24    [20270490]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
o-o
Guest
затем, что UTF16 это юникод SQL Server-а
7 мар 17, 12:27    [20270505]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
У нас получается следующий расклад

если мы загоняем параметры в хранимую процедуру, то нам требуется перекодировка UTF-8 в cp1251. Если мы получаем возвращаемый параметр из храники, нам нужно обязательно сделать перекодировку из cp1251 в UTF-8. Но, если хранимая процедура возвращает набор данных, то набор данных перекодировать уже не нужно.


а ещё интересней. Если работа идёт через WEB сервер, который стоит на линуксе, то перекодировка вообще никакая не требуется.

И мы понять не можем в чём дело.. Есть у кого ещё какие мысли, как можно заставить WEB сервер установленный на виндовс заставить работать без перекодировок?
7 мар 17, 12:28    [20270517]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить