【问题标题】:Storing ???? in database is encoding issue?存储???在数据库中是编码问题吗?
【发布时间】:2017-08-17 07:11:52
【问题描述】:

我有 MS SQL 数据库,其排序规则设置为 SQL_Latin1_General_CP1_CI_AS。我通过 PHP(Freebsd OS 上的 Nginx 服务器)连接到数据库。当我尝试保存ജെയിംസ്, جیمز 等字符时,它存储为????。我的 default_charset 在 PHP 中是 UTF-8

更新: 当我从本地 Windows 环境中尝试它时,它成功存储了字符。但从 Freebsd 环境来看,它有问题。下面是分别从 Windows 和 Freebsd 环境调用的存储过程。

来自 Windows 机器的跟踪:

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

来自 Freebsd 的跟踪:

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

在 windows 中,它在 N 前面加上参数 p_UserName,但在 Freebsd 中不是。

Update2:关于来自PHP Laravel5.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


【解决方案1】:

你不能。

Latin-1 是专为西欧语言(西班牙语、法语...)设计的单字节字符集。它无法物理存储您需要的随机 Unicode 字符。

您需要返回设计表并将所涉及的列类型更改为可识别 Unicode 的对应项(也称为“国家”),例如从VARCHARNVARCHAR

您还需要确保您的 PHP 连接配置正确。你没有说你正在使用什么扩展,而是在例如你会这样做的 SQLSRV 扩展:

sqlsrv_connect($dsn, array(
    // ...
    'CharacterSet' => 'UTF-8',
));

【讨论】:

  • 我试过这个但没有用。请查看我的问题更新
  • @KirenSiva “试过这个”是否确认您正在使用 SQLSRV 扩展?你还没有明确地说出来(也没有分享任何 PHP 代码)。
  • 对不起,我错过了。请检查更新2
  • 对,对不起,我对 Laravel 一无所知。
【解决方案2】:

不确定这是否适用于 PHP,但你可以试试这个:

  • 将列类型改为nvarchar(xx)
  • 在进行插入或更新时,使用 N 前缀。

像这样:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2011-04-26
    • 2010-11-10
    • 2017-01-27
    • 2013-05-17
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多