Хранение ???? в базе данных проблема с кодировкой?

У меня есть база данных MS SQL с настройкой сортировки SQL_Latin1_General_CP1_CI_AS. Я подключаюсь к базе данных через ???????, ???? (Сервер Nginx на ОС Freebsd). Когда я пытаюсь сохранить такие символы, как и ????т. Д., Он хранится как UTF-8. Мой default_charset находится в PHP.declare @p1 int set @p1=2 declare @p14 int set @p14=0 exec sp_prepexec @p1 output,N'@P1 nvarchar(15),@P2 nvarchar(16),@P3 nvarchar(10),@P4 nvarchar(max),@P5 nvarchar(max),@P6 char(1),@P7 char(1),@P8 nvarchar(max),@P9 int,@P10 nvarchar(1),@P11 int OUTPUT',N'EXEC ValidateFBLogin_sp @p_UserName = @P1, @p_Email = @P2, @p_FBID = @P3, @p_DeviceToken = @P4, @p_IPAddress = @P5, @p_Latitude = @P6, @p_Longitude = @P7, @p_EndpointArn = @P8, @p_UserAccountTypeID = @P9, @p_DeviceType = @P10, @p_ErrID = @P11 OUTPUT',N'?????',N'ashley@gmail.com',N'67463sgs7s',N'',N'',NULL,NULL,N'',2,N'1',@p14 output select @p1, @p14

UPDATE : когда я попробовал это из моего локального Windows env, он успешно сохранял символы. Но из среды Freebsd возникает проблема. Ниже приведен вызов хранимой процедуры из среды Windows и Freebsd соответственно.

Трассировка с Windows-машины:

EXEC ValidateFBLogin_sp 
@p_UserName = '?????', @p_Email = 'ashley@gmail.com', @p_FBID = '45534552', @p_DeviceToken = '', 
@p_IPAddress = '', @p_Latitude = NULL, @p_Longitude = NULL, 
    @p_EndpointArn = '', @p_UserAccountTypeID = 2, 
@p_DeviceType = '1', @p_ErrID = 0

Трассировка из Freebsd:

PHP

Из окон это pre-end N с параметром p_UserName, но в Freebsd это не так.

Обновление2 : Что касается подключения к базе данных из PHPLaravel5.3 Framework

Параметры подключения: config / database.php

return [
'sqlsrvstaging' => [
    'driver' => 'sqlsrv',
    'host' => 'XXXXX',
    'database' => 'XXXXX',
    'username' => 'XXXXX',
    'password' => 'XXXXX',
    'prefix' => '',
    'charset' => 'UTF-8',
    'strict' => false,
    'pooling' => false,
    ]
];

Код $this->pdo = DB::connection('sqlsrvstaging')->getPdo();

php,sql-server,nginx,laravel-5.3,sqlsrv,

0

Ответов: 2


0

Не уверен, что это работает в PHP, но вы можете попробовать это:

  • измените тип столбца на nvarchar(xx),
  • при вставке или обновлении используйте префикс N.

Как это:

insert into Table(C1, C2)
values (N'123456789', N'Name')

0

Ты не можешь.

Latin-1 - это однобайтовая кодировка, предназначенная для языков Западной Европы (испанский, французский ...). Он не может физически хранить случайные символы Unicode, такие как те, которые вам нужны.

Вы должны вернуться к таблице параметров и изменить типы столбцов , участвующих в его Юникоде коллег ( так называемый «национальный»), например , от VARCHARдо NVARCHAR.

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

sqlsrv_connect($dsn, array(
    // ...
    'CharacterSet' => 'UTF-8',
));
PHP, SQL-сервер, Nginx, Laravel-5,3, SQLSRV,
Похожие вопросы