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

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

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

Ну это по поводу кодировки.
А вот как пустая строка в мусор превращается - этого не знаю.
Интересно - а если просто пробел передать?


Пробел это Вам не '', а значит как и говорил всё ок. Если NULL засунуть, то же всё ок.
8 мар 17, 14:11    [20274404]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

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

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

CREATE PROCEDURE [TT_Test]
  ..
  ..
  -- Описание ответа.
  @AnswerText	NVARCHAR(256) = '' OUTPUT
AS
 ..
 ..
 SET @AnswerText = ''
 RETURN 0
GO


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

ЗЫ. Страдалец, ну научись уже сам отвечать за свои косяки. А не валить все на MS SQL.
В качестве утешения могу заверить тебя, что в нормальных языках программирования - усе хорошо.


При чём тут "хрустальные шары", мы подпилили как Вы посоветовали, и, всё сделано как написано спецами из майкрософт. Всё работает, за исключением 1-го нюанса. Хочется разобраться чё за мусор приходит..
8 мар 17, 14:16    [20274418]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
aleks2
Guest
Да, мой секретный хрустальный шар для криворуких программистов показывает:

"Если криворукий программист инициализирует переменную $outParam как пустую строку, то 146%, что все наладится."
8 мар 17, 14:18    [20274421]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Massa52
Member

Откуда:
Сообщений: 387
Игорь_UUS,
Почему у пустой строки не стоит N?
SET @AnswerText = ''

Непорядок однако.
Ну если пстая строка так важна - поулчите пробел(он то ведь работает с вашим PHP) и натравите на него что нить типа TRIMа PHP-шного.
8 мар 17, 14:34    [20274465]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
Massa52
Игорь_UUS,
Почему у пустой строки не стоит N?
SET @AnswerText = ''

Непорядок однако.
Ну если пстая строка так важна - поулчите пробел(он то ведь работает с вашим PHP) и натравите на него что нить типа TRIMа PHP-шного.


Проще (и правильней) NULL вернуть. Тут дело в другом, уж очень хочется разобраться
8 мар 17, 14:39    [20274474]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Massa52
Member

Откуда:
Сообщений: 387
Игорь_UUS,
Еще раз - почему строка без N?
Любая NVAR... константа должна начинаться с N
8 мар 17, 14:47    [20274503]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
aleks2
Да, мой секретный хрустальный шар для криворуких программистов показывает:

"Если криворукий программист инициализирует переменную $outParam как пустую строку, то 146%, что все наладится."


В этот раз "хрустальный шар" говорит неправду

Переменная $outParam передается по ссылке. Естественно она инициализируется перед передачей. При этом абсолютно неважно как она инициализируется.
$outParam = 0;
$outParam = NULL;
$outParam = '';
$outParam = ' ';
Результат в любом случае один и тот же.
8 мар 17, 14:58    [20274538]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 680
Massa52
Игорь_UUS,
Еще раз - почему строка без N?
Любая NVAR... константа должна начинаться с N


Неважно, и с N и без N. Результат один.

Если не пустая строка и без N, отрабатывает как надо, ни крошки мусора
8 мар 17, 14:59    [20274546]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
aleks2
Guest
Игорь_UUS
aleks2
Да, мой секретный хрустальный шар для криворуких программистов показывает:

"Если криворукий программист инициализирует переменную $outParam как пустую строку, то 146%, что все наладится."


В этот раз "хрустальный шар" говорит неправду

Переменная $outParam передается по ссылке. Естественно она инициализируется перед передачей. При этом абсолютно неважно как она инициализируется.
$outParam = 0;
$outParam = NULL;
$outParam = '';
$outParam = ' ';
Результат в любом случае один и тот же.


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

Ибо если бы было не так - стон стоял бы по фсей Земле.

Значит - корень зла PHP.
Иди, страдалец, на форум PHP-истов и учись у них правильно вызывать процедуры.
8 мар 17, 15:09    [20274572]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
invm
Member

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

Драйвер не пробовали обновить на более свежий?
8 мар 17, 15:31    [20274643]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

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


В этот раз "хрустальный шар" говорит неправду

Переменная $outParam передается по ссылке. Естественно она инициализируется перед передачей. При этом абсолютно неважно как она инициализируется.
$outParam = 0;
$outParam = NULL;
$outParam = '';
$outParam = ' ';
Результат в любом случае один и тот же.


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

Ибо если бы было не так - стон стоял бы по фсей Земле.

Значит - корень зла PHP.
Иди, страдалец, на форум PHP-истов и учись у них правильно вызывать процедуры.



Мы следуем инструкциям Microsoft, все сделано по мануалам.
А имеем какую-то неведомую фигню.
Единственное что мы выяснили в этом треде это то, что Вы считаете, что MS SQL не при чем (точнее тот кто писал драйвер).
А в чем дело никто тут не в курсе. И заморачиваться не хотят. Как вариант могут что-то знать об этом на форуме PHP, я написал там.
Но мне кажется все уткнется в драйвер MS SQL для PHP.
8 мар 17, 15:34    [20274653]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

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

Драйвер не пробовали обновить на более свежий?


сейчас используем

4.0.8629.2

свежее вроде нет
8 мар 17, 15:35    [20274654]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
iljy
Member

Откуда:
Сообщений: 8711
Игорь_UUS
Мы следуем инструкциям Microsoft, все сделано по мануалам.
А имеем какую-то неведомую фигню.
Единственное что мы выяснили в этом треде это то, что Вы считаете, что MS SQL не при чем (точнее тот кто писал драйвер).
А в чем дело никто тут не в курсе. И заморачиваться не хотят. Как вариант могут что-то знать об этом на форуме PHP, я написал там.
Но мне кажется все уткнется в драйвер MS SQL для PHP.


В том, что MS SQL не при чем, можно тривиальнейшим образом убедиться, выполнив в студии скрипт
CREATE PROCEDURE [TT_Test] NVARCHAR(256) = '' OUTPUT
AS
 SET @AnswerText = ''
 RETURN 0
GO

declare   @AnswerText	NVARCHAR(256), @r int

exec @r = TT_Test @AnswerText out
select @r, '"' + @AnswerText + '"'
GO

drop proc TT_Test


И совершенно непонятно ваше возмущение фактом, что на форуме по MS SQL не хотят заморачиваться глюками PHP.
8 мар 17, 15:40    [20274680]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
aleks2
Guest
Игорь_UUS
aleks2
пропущено...


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

Ибо если бы было не так - стон стоял бы по фсей Земле.

Значит - корень зла PHP.
Иди, страдалец, на форум PHP-истов и учись у них правильно вызывать процедуры.



Мы следуем инструкциям Microsoft, все сделано по мануалам.
А имеем какую-то неведомую фигню.
Единственное что мы выяснили в этом треде это то, что Вы считаете, что MS SQL не при чем (точнее тот кто писал драйвер).
А в чем дело никто тут не в курсе. И заморачиваться не хотят. Как вариант могут что-то знать об этом на форуме PHP, я написал там.
Но мне кажется все уткнется в драйвер MS SQL для PHP.


Страдалец, ты даже не удосужился привести полный код вызова для PHP.

А надо то вот так:

<?php
// Соединяемся с MSSQL и выбираем базу
mssql_connect('KALLESPC\SQLEXPRESS', 'sa', 'phpfi');
mssql_select_db('php');

// Создаем новую хранимую процедуру
$stmt = mssql_init('NewUserRecord');

// Связываем имена полей
mssql_bind($stmt, '@username',  'Kalle',  SQLVARCHAR,  false,  false,  60);
mssql_bind($stmt, '@name',      'Kalle',  SQLVARCHAR,  false,  false,  60);
mssql_bind($stmt, '@age',       19,       SQLINT1,     false,  false,   3);

// Запускаем
mssql_execute($stmt);

// Освобождаем
mssql_free_statement($stmt);
?> 
8 мар 17, 15:43    [20274696]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

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



Мы следуем инструкциям Microsoft, все сделано по мануалам.
А имеем какую-то неведомую фигню.
Единственное что мы выяснили в этом треде это то, что Вы считаете, что MS SQL не при чем (точнее тот кто писал драйвер).
А в чем дело никто тут не в курсе. И заморачиваться не хотят. Как вариант могут что-то знать об этом на форуме PHP, я написал там.
Но мне кажется все уткнется в драйвер MS SQL для PHP.


Страдалец, ты даже не удосужился привести полный код вызова для PHP.

А надо то вот так:

<?php
// Соединяемся с MSSQL и выбираем базу
mssql_connect('KALLESPC\SQLEXPRESS', 'sa', 'phpfi');
mssql_select_db('php');

// Создаем новую хранимую процедуру
$stmt = mssql_init('NewUserRecord');

// Связываем имена полей
mssql_bind($stmt, '@username',  'Kalle',  SQLVARCHAR,  false,  false,  60);
mssql_bind($stmt, '@name',      'Kalle',  SQLVARCHAR,  false,  false,  60);
mssql_bind($stmt, '@age',       19,       SQLINT1,     false,  false,   3);

// Запускаем
mssql_execute($stmt);

// Освобождаем
mssql_free_statement($stmt);
?> 


Это пример того как нужно код выкладывать?
Библиотека с набором функций mssql_* была разработана ребятами из php, устарела уже фиг знает когда.
На данный момент существует два актуальных способа работы с MS SQL из php - это расширение для PDO и набор функций sqlsrv_*.
В проблемном коде используется набор функций sqlsrv_*.
Примеры работы с sqlsrv_* можно посмотреть по ссылке которую уже скидывали в треде https://docs.microsoft.com/en-us/sql/connect/php/how-to-send-and-retrieve-utf-8-data-using-built-in-utf-8-support
По сути используется копипаста из статьи по этой ссылке.
8 мар 17, 16:10    [20274809]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

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

Вы приводите пример, который противоречит той ссылке, которую вы посоветовали изначально! Вы попробуйте выполнить простой запрос к процедуре (который в ответе возвращает ''), который Вы же и сочли плавильным для работы с MSSQL (кинув ссылку на мануал).. и убедитесь, что что-то не так, а не ищите на форуме страдальцев.

Вы хорошо помогли, кинув ссылку, но потом только одна болтовня про страдальцев и не более
8 мар 17, 16:17    [20274827]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Massa52
Member

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

Хорошо - покажи свой мусор?
8 мар 17, 17:22    [20274994]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Игорь_UUS
свежее вроде нет
Тогда попробуйте более старый. Проблема, вероятнее всего, именно в драйвере.
8 мар 17, 17:38    [20275034]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

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

Хорошо - покажи свой мусор?


тут этого "мусора" полным полно: https://docs.microsoft.com/en-us/sql/connect/php/how-to-send-and-retrieve-utf-8-data-using-built-in-utf-8-support
8 мар 17, 19:00    [20275208]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Игорь_UUS
Member

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


Старый под новый MSSQL не рекомендуют использовать.. на форуме php пишут что скорей всего это бага драйвера и рекомендуют возвращать NULL. Так и поступим... всем спасибо за уделённое время
8 мар 17, 19:01    [20275210]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Massa52
Member

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

Я не об этом мусоре.
А о том - как вы смотрите в PHP на возвращаемую строку(там есть дебагер?).
Я вам не верю.
8 мар 17, 23:58    [20275997]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31956
Игорь_UUS
тут этого "мусора" полным полно: https://docs.microsoft.com/en-us/sql/connect/php/how-to-send-and-retrieve-utf-8-data-using-built-in-utf-8-support
Ошибка же проявляется в конкретном вашем коде, а не ы офисе микрософта при проверке кода из документации.
Вы думаете, тот код, по ссылке, из docs.microsoft.com, нерабочий?

Варианта всего 2: в вашем коде ошибка, или драйвер кривой (или что то криво встало).

С ошибкой в драйвере вам тут точно не помогут, ошибки в вашем коде вообще тут офтопик, ну так вы хотя бы выложили код, если хотите какой то помощи.
9 мар 17, 01:25    [20276133]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Massa52
Member

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

И еще - строка строке рознь. Вариант - что и в африке тут не прходит.
Есть несколько способов хранения String данных(с длиной вначале строки или замыкающий 0).
Может оказаться - что у сиквела один а у PHP другой и есть нестыковка в преобразовании.
Так что - плизз код с мусором в студию.
9 мар 17, 02:46    [20276166]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
aleks2
Guest
Massa52
Игорь_UUS,

И еще - строка строке рознь. Вариант - что и в африке тут не прходит.
Есть несколько способов хранения String данных(с длиной вначале строки или замыкающий 0).
Может оказаться - что у сиквела один а у PHP другой и есть нестыковка в преобразовании.
Так что - плизз код с мусором в студию.


Я те открою страшную тайну
1. Есть и другие способы хранения строки.
2. Задача "драйвера" - аккурат и заключается в "состыковать".
9 мар 17, 05:39    [20276181]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про UTF-8 и cp1251  [new]
Massa52
Member

Откуда:
Сообщений: 387
Игорь_UUS,
Поскольку у меня нет PHP, а есть VS 2015 и винда английская 10.
USE [Test]
GO
/****** Object:  StoredProcedure [dbo].[TT_Test]    Script Date: 3/9/2017 1:53:09 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[TT_Test] --NVARCHAR(256) = '' OUTPUT
  -- Описание ответа.
  @AnswerText			NVARCHAR(256) = '' OUTPUT
AS
 SET @AnswerText = N'Тест'
 RETURN 0

с#

using System;
using System.Data;
using System.Data.SqlClient;

namespace ConsoleApplication13
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Testing Stored Procedure");
            using (SqlConnection conn = new SqlConnection("Server=.;DataBase=Test;Integrated Security=SSPI"))
            {
                conn.Open();

                // 1.  create a command object identifying the stored procedure
                SqlCommand cmd = new SqlCommand("TT_Test", conn);

                // 2. set the command object so it knows to execute a stored procedure
                cmd.CommandType = CommandType.StoredProcedure;

                // 3. add parameter to command, which will be passed to the stored procedure
                //cmd.Parameters.Add(new SqlParameter("@AnswerText"));
                SqlParameter parameter = new SqlParameter
                {
                    ParameterName = "@AnswerText",
                    IsNullable = true,
                    SqlDbType = SqlDbType.NVarChar,
                    Direction = ParameterDirection.Output,
                    Size = 256
                };

                cmd.Parameters.Add(parameter);

                // execute the command
                using (SqlDataReader rdr = cmd.ExecuteReader())
                {
                    // iterate through results, printing each to console
                    while (rdr.Read())
                    {
                    }
                    Console.WriteLine("AnswerText: {0,-35} Len: {1,2}", parameter.SqlValue, parameter.SqlValue.ToString().Length);

                }
            }
            Console.Read();
        }
    }
}

locale - english
получил на выходе ????
locale - russian
Testing Stored Procedure
AnswerText: Тест Len: 4
В дебаггере
+ SqlValue {Тест} object {System.Data.SqlTypes.SqlString}
Это даже не стринг - а объект. Что в PHP не знаю
Теперь с пустой строкой на выходе никакого мусора.
Testing Stored Procedure
AnswerText: Len: 0
9 мар 17, 06:32    [20276194]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить