2017-03-24 69 views
0

我有Mssql數據庫與排序規則設置爲SQL_Latin1_General_CP1_CI_AS。我通過PHP(Freebsd OS上的Nginx服務器)連接到數據庫。當我試圖保存ജെയിംസ്, جیمز等字符時,它將以????的形式存儲。我的default_charset是PHP中的UTF-8。你能幫我解決這個問題嗎?謝謝。存儲????在數據庫中是編碼問題?

UPDATE: 當我從我當地的Windows env試用它時,它成功存儲了字符。但從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'[email protected]',N'67463sgs7s',N'',N'',NULL,NULL,N'',2,N'1',@p14 output 
select @p1, @p14 

跟蹤從FreeBSD的安裝:

EXEC ValidateFBLogin_sp 
@p_UserName = 'ആഷ്ലി', @p_Email = '[email protected]', @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是準備結束的ñ與在參數p_UserName但在FreeBSD事實並非如此。

UPDATE2:從PHP Laravel5.3框架

連接參數關於數據庫連接:配置/ 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();

+2

使用Unicode字符集存儲UTF-8編碼的文本:http://stackoverflow.com/a/32128634/1363190 –

回答

0

不知道這工作在PHP ,但你可以試試這個:

  • 將列的類型更改爲nvarchar(xx),
  • 當進行插入或更新時,使用N前綴。

像這樣:

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

請看看我的更新。 –

0

你不能。

Latin-1是爲西歐語言(西班牙語,法語...)設計的單字節字符集。它不能物理地存儲隨機的Unicode字符,比如你需要的字符。您需要返回到設計表並將涉及的列的類型更改爲可識別Unicode的對應項(又名「國家」),例如,從VARCHARNVARCHAR

您還需要確保您的PHP連接已正確配置。你沒有說你在使用什麼擴展名,但是在例如在SQLSRV擴展,你可以這樣做:

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

我試過但沒有工作。請參閱我的問題更新 –

+0

@KirenSiva「試過這個」確認您正在使用SQLSRV擴展?你還沒有明確地說過(也沒有分享任何PHP代碼)。 –

+0

對不起,我錯過了。請檢查Update2 –