我有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开始,它是使用in param p_UserName预备N,但在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();
答案 0 :(得分:0)
不确定这是否适用于PHP,但您可以尝试:
nvarchar(xx)
,像这样:
insert into Table(C1, C2)
values (N'123456789', N'Name')
答案 1 :(得分:0)
你不能。
Latin-1是为西欧语言(西班牙语,法语......)设计的单字节字符集。它无法物理存储您需要的随机Unicode字符。
您需要返回到设计表并将所涉及的列的类型更改为其支持Unicode的对应物(也称为“国家”),例如从VARCHAR
到NVARCHAR
。
您还需要确保正确配置PHP连接。你没有说你正在使用什么扩展名,但在例如您执行此操作的SQLSRV扩展名:
sqlsrv_connect($dsn, array(
// ...
'CharacterSet' => 'UTF-8',
));