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

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

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


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

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


Хотелось бы ещё понять. Почему на WEB сервере установленном под винду нужны перекодировке, а если WEB сервер установлен на линуксе перекодировки ненужны???
7 мар 17, 12:39    [20270607]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
Игорь_UUS
Загвоздка в том, что где-то надо делать перекодировку, а где то она не требуется. Голова "опухла", разобраться не можем
Ну, нужно успокоиться и разобраться :-)

Ничего же сложного нет, главное, что это всё взаимо-независимо.
Это всё есть полностью изолированные решения и технические приёмы.

1. Решаете, использовать однобайтные кодировки или юникод.
2. Определяете, какой язык используется, кроме английского.
3. Выбираете, исходя из этого, тип данных и коллейшен с базе.
4. В приложении при отправлении или получении данных перекодируете их.
5. Для упрощения лучше, что бы в приложении использовался тоже какой то один тип данных, и какая то одна кодировка.
Если п. 5 выполняется, то вообще всё примитивно, сказать всем, и пусть делают, ошибиться или запутаться негде.
Если не выполняется, то да, будет некоторая путаница, но в общем тоже можно разобраться.
7 мар 17, 12:46    [20270654]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
Игорь_UUS
И мы понять не можем в чём дело.. Есть у кого ещё какие мысли, как можно заставить WEB сервер установленный на виндовс заставить работать без перекодировок?
Вообще это не вопрос для форума по сиквелу, это в веб-программирование по тем технологиям, которые вы используете.

Но вообще такие штуки делаются несколькими строками кода, если правильно программировать, т.е. если вы не колупаете вызовы к сиквелу прямо в серверном коде, если у вас они вынесены в собственную библиотеку.
7 мар 17, 12:50    [20270695]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
aleks2
Guest
Игорь_UUS
У нас получается следующий расклад

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


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

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


1. Фсе современные системы программирования поддерживают объект STRING конкретной кодировки, в том числе и UNICODE STRING.
2. Научитесь, наконец то, объявлять тип переменной.
7 мар 17, 13:07    [20270786]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Игорь_UUS
И мы понять не можем в чём дело
Рискну предположить, что вы не в курсе про параметризованные запросы и просто склеиваете строку вызова процедуры с подстановкой значений.
Отсюда все ваши беды с перекодировками. Плюс непонимание что такое юникод в MSSQL.
7 мар 17, 13:14    [20270825]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

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

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

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

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

вопрос в том какого фига один и тот же код на линуксе и на винде при наиболее равных условиях работает по разному
7 мар 17, 13:22    [20270865]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Игорь_UUS
используются параметризированные запросы
Тогда правильно указывайте тип параметра.
7 мар 17, 13:23    [20270871]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
Игорь_UUS
вопрос в том какого фига один и тот же код на линуксе и на винде при наиболее равных условиях работает по разному
Видимо, потому, что написан платформо-зависимый код.
7 мар 17, 13:28    [20270897]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 671
invm
Игорь_UUS
используются параметризированные запросы
Тогда правильно указывайте тип параметра.


Что Вы имеете ввиду? указывать где, а главное как? у нас на стороне сервера всё оперируется в NVARCHAR
7 мар 17, 14:08    [20271097]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
aleks2
Guest
Игорь_UUS
invm
пропущено...
Тогда правильно указывайте тип параметра.


Что Вы имеете ввиду? указывать где, а главное как? у нас на стороне сервера всё оперируется в NVARCHAR


Теперь сделайте ТО ЖЕ САМОЕ на стороне веб-сервиса.
7 мар 17, 14:12    [20271128]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Massa52
Member

Откуда:
Сообщений: 380
А что приходит в этот NVARCHAR в первом и втором случае?
В случае линуха и винды.
7 мар 17, 14:15    [20271145]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Игорь_UUS
Что Вы имеете ввиду? указывать где, а главное как?
https://docs.microsoft.com/en-us/sql/connect/php/how-to-specify-sql-server-data-types-when-using-the-sqlsrv-driver
7 мар 17, 14:17    [20271155]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
aleks2
Guest
  With New ADODB.Command
    .CommandText = "dbo.SomeProcedure"
    .CommandType = adCmdStoredProc
    .CommandTimeout = 120
    .ActiveConnection = CurrentProject.Connection
    .Parameters.Append .CreateParameter("@SomeParameter", adVarWChar , adParamInput, , "Текст параметра")
    .Execute Options:=adExecuteNoRecords
  End With
7 мар 17, 14:17    [20271157]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Wlr-l
Member

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

"Хотелось бы ещё понять. Почему на WEB сервере установленном под винду нужны перекодировке, а если WEB сервер установлен на линуксе перекодировки ненужны???", "а там всегда UTF-8".

Это значит, что UTF-8, приходящий из Windows, и UTF-8, приходящий из Linux, отличаются. Кроме числа байт, отводимых на один символ, есть еще и порядок следования этих байт. Смотрите стандарты.

В случаях, когда есть несколько групп разработчиков, сначала разрабатывается интерфейс и требования к частям. Каждая группа разработчиков должна следовать этому. Тогда не может быть такого, что данные, приходящие из разных направлений, будут несовместимыми.

Есть решения преобразования кодов и на T-SQL, поиск по этому форуму позволит найти решение.

И все же необходимость такого преобразование неочевидна.
7 мар 17, 14:57    [20271360]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
dfhgdfh
Guest
http://www.vbforums.com/showthread.php?433385-ADO-Recordset-unicode-support

ADO Recordset unicode support
7 мар 17, 15:12    [20271424]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 671
invm
Игорь_UUS
Что Вы имеете ввиду? указывать где, а главное как?
https://docs.microsoft.com/en-us/sql/connect/php/how-to-specify-sql-server-data-types-when-using-the-sqlsrv-driver


Огромное спасибо. Теперь на линуксе и винде не нужна перекодировка

и так:

$call = "{call ProcedureName(?, ?)}";

если параметры передавать вот в таком виде требует перекодировку входящего параметра из utf-8 в cp1251 и исходящего из cp1251 в utf-8:
$data = [
[$inParam, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_NVARCHAR(900)],
[&$outParam, SQLSRV_PARAM_OUT, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_NVARCHAR(256)]
];

а вот в таком происходит странное - если исходящий параметр является пустой строкой, то переменная наполняется мусором из оперативной памяти, но в остальных случаях перекодировка не нужна:
$data = [
[$inParam, SQLSRV_PARAM_IN],
[&$outParam, SQLSRV_PARAM_OUT, null, SQLSRV_SQLTYPE_NVARCHAR(256)]
];


Не можем понять, если я в возвращаемый параметр отдавать '' то приходит мусор равный по байтам размеру переменной... это как то можно обойти?
7 мар 17, 15:34    [20271527]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
aleks2
Guest
Игорь_UUS
если параметры передавать вот в таком виде требует перекодировку входящего параметра из utf-8 в cp1251 и исходящего из cp1251 в utf-8:

это как то можно обойти?


Убейтесь уже ап стену.

ЗЫ. Вам десять раз сказали: используйте utf-16. Забудьте про cp1251.
7 мар 17, 18:31    [20272241]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
aleks2
Guest
Там же ангельским написано

SQLSRV_PHPTYPE_STRING($encoding1) String

SQLSRV_PHPTYPE_STRING accept a parameter that specifies the stream encoding.

The following table contains the SQLSRV constants that are acceptable parameters, and a description of the corresponding encoding.


SQLSRV constant Description

SQLSRV_ENC_CHAR Data is returned in 8-bit characters as specified in the code page of the Windows locale that is set on the system. Any multi-byte characters or characters that do not map into this code page are substituted with a single byte question mark (?) character.

"UTF-8" Data is returned in the UTF-8 encoding. This constant was added in version 1.1 of the Microsoft Drivers for PHP for SQL Server. For more information about UTF-8 support, see How to: Send and Retrieve UTF-8 Data Using Built-In UTF-8 Support.


Какого хрена пихать SQLSRV_ENC_CHAR?

in the code page of the Windows locale that is set on the system
Это неиллюзорный геморрой, Карл!
7 мар 17, 18:53    [20272272]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 671
aleks2
Там же ангельским написано

SQLSRV_PHPTYPE_STRING($encoding1) String

SQLSRV_PHPTYPE_STRING accept a parameter that specifies the stream encoding.

The following table contains the SQLSRV constants that are acceptable parameters, and a description of the corresponding encoding.


SQLSRV constant Description

SQLSRV_ENC_CHAR Data is returned in 8-bit characters as specified in the code page of the Windows locale that is set on the system. Any multi-byte characters or characters that do not map into this code page are substituted with a single byte question mark (?) character.

"UTF-8" Data is returned in the UTF-8 encoding. This constant was added in version 1.1 of the Microsoft Drivers for PHP for SQL Server. For more information about UTF-8 support, see How to: Send and Retrieve UTF-8 Data Using Built-In UTF-8 Support.


Какого хрена пихать SQLSRV_ENC_CHAR?

in the code page of the Windows locale that is set on the system
Это неиллюзорный геморрой, Карл!



Потому что там два варианта SQLSRV_ENC_CHAR и SQLSRV_ENC_BINARY? И тот и тот ессно не работают.
7 мар 17, 19:23    [20272349]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
Игорь_UUS
Потому что там два варианта SQLSRV_ENC_CHAR и SQLSRV_ENC_BINARY? И тот и тот ессно не работают.
Там вообще то 3 варианта, третий - "UTF-8"
https://docs.microsoft.com/en-us/sql/connect/php/constants-microsoft-drivers-for-php-for-sql-server

SQLSRV_ENC_BINARY используется, когда вы передаёте не текст, а произвольные байты.
SQLSRV_ENC_CHAR используется, когда вы передаёте текст в однобайтной кодировке, причём эжта кодировка - Windows
А "UTF-8" используется, когда строки в приложении юникодные, как, собственно, нормальные люди и делают.

Вот пример использования:
https://docs.microsoft.com/en-us/sql/connect/php/how-to-send-and-retrieve-utf-8-data-using-built-in-utf-8-support

Кстати, вам и aleks2 написал про три варианта, и даже джирненьким выделил, но всё равно вы пишите, что там два варианта.
Как это???
7 мар 17, 19:49    [20272411]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 671
alexeyvg
Игорь_UUS
Потому что там два варианта SQLSRV_ENC_CHAR и SQLSRV_ENC_BINARY? И тот и тот ессно не работают.
Там вообще то 3 варианта, третий - "UTF-8"
https://docs.microsoft.com/en-us/sql/connect/php/constants-microsoft-drivers-for-php-for-sql-server

SQLSRV_ENC_BINARY используется, когда вы передаёте не текст, а произвольные байты.
SQLSRV_ENC_CHAR используется, когда вы передаёте текст в однобайтной кодировке, причём эжта кодировка - Windows
А "UTF-8" используется, когда строки в приложении юникодные, как, собственно, нормальные люди и делают.

Вот пример использования:
https://docs.microsoft.com/en-us/sql/connect/php/how-to-send-and-retrieve-utf-8-data-using-built-in-utf-8-support

Кстати, вам и aleks2 написал про три варианта, и даже джирненьким выделил, но всё равно вы пишите, что там два варианта.
Как это???


По этим мануалам все и делалось.
Сейчас вопрос состоит не в количестве кодировок. И даже не в том что бы найти мануалы от микрософта.

Ситуация такова:

При получении из хранимой процедуры вызванной параметрическим запросом ответа SQLSRV_PARAM_OUT
при указании SQLSRV_PHPTYPE_STRING('UTF-8') (или можно передать null, т.к. в строке подключения прописано "CharacterSet" => "UTF-8")
если НЕ УКАЗЫВАТЬ SQLSRV_SQLTYPE_NVARCHAR(256) в любом случае появляется ошибка "Усечение данных строки справа"
если УКАЗЫВАТЬ SQLSRV_SQLTYPE_NVARCHAR(256) то в случае если процедура возвращает пустую строку, то в переменную записываются произвольные(или не очень?) 256 байт из оперативной памяти sql-сервера. Если в возвращаемом параметре есть какие-то данные, то все в порядке.

Вопрос:
Каким образом нужно изменить массив параметров для параметризированного запроса что бы не было выдергивания кусков оперативной памяти сервера и не было ошибок перекодировок и ошибок усечения данных.

На данный момент массив выглядит примерно так:
$data = [
[$inParam, SQLSRV_PARAM_IN],
[&$outParam, SQLSRV_PARAM_OUT, SQLSRV_PHPTYPE_STRING('UTF-8'), SQLSRV_SQLTYPE_NVARCHAR(256)]
]
8 мар 17, 13:27    [20274313]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 671
но у нас проблема в том что драйвер отдает какие-то дурные данные если процедура возвращает пустую строку

если так, то получаем на стороне php 256 байт мусора:

-- Запрос на получение планировщиков, профессии и ресурсов.
-- Начиная с API V2. для замены [MAPP_WS_MS_EV1_GetProfession].
CREATE PROCEDURE [TT_Test]
  ..
  ..
  -- Описание ответа.
  @AnswerText	NVARCHAR(256) = '' OUTPUT
AS
 ..
 ..
 SET @AnswerText = ''
 RETURN 0
GO
8 мар 17, 13:38    [20274338]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Massa52
Member

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

Может попробовать выставить Windows locale - Russia.
Без этой фишки обычно стоит по умолчанию кодовая 1252.
А с ней 1251.
Я всегда в английской винде если пользуюсь русским я. - выставляю.
Иначе - сплошь и рядом вылазят ??????

Ну это по поводу кодировки.
А вот как пустая строка в мусор превращается - этого не знаю.
Интересно - а если просто пробел передать?
8 мар 17, 14:02    [20274385]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
aleks2
Guest
Игорь_UUS
но у нас проблема в том что драйвер отдает какие-то дурные данные если процедура возвращает пустую строку

если так, то получаем на стороне php 256 байт мусора:

-- Запрос на получение планировщиков, профессии и ресурсов.
-- Начиная с API V2. для замены [MAPP_WS_MS_EV1_GetProfession].
CREATE PROCEDURE [TT_Test]
  ..
  ..
  -- Описание ответа.
  @AnswerText	NVARCHAR(256) = '' OUTPUT
AS
 ..
 ..
 SET @AnswerText = ''
 RETURN 0
GO


Ща, весь форум MS SQL будет мучительно вглядываться в хрустальные шары, чтобы найти кривизну в программе PHP.

ЗЫ. Страдалец, ну научись уже сам отвечать за свои косяки. А не валить все на MS SQL.
В качестве утешения могу заверить тебя, что в нормальных языках программирования - усе хорошо.
8 мар 17, 14:10    [20274401]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить