SQL Server 版本 : 2005
SQL 難字寫入欄位型態 nvarchar
SQL 難字寫入欄位定序 Chinese_Taiwan_Stroke_CI_AS (BIG5)
PHP 版本 5.2.6
SQL 範例資料庫如下
CREATE TABLE [dbo].[zzzzpost] (
[aaa] nvarchar(10) NULL ,
[bbb] nvarchar(10) NULL ,
[ccc] nvarchar(10) NULL ,
[ddd] nvarchar(10) NULL ,
[eee] nvarchar(10) NULL ,
[dt] nvarchar(50) NULL ,
[id] bigint NOT NULL IDENTITY(1,1) ,
[fff] nvarchar(50) NULL
)
ALTER TABLE [dbo].[zzzzpost] ADD PRIMARY KEY ([id])
PHP POST端測試範例程式碼如下
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
<form role="form" action="post.php" method="post">
<input type="text" name="aaa" value="<?PHP echo rand(100,200); ?>"><br/>
<input type="text" name="bbb" value="<?PHP echo rand(100,200); ?>"><br/>
<input type="text" name="ccc" value="<?PHP echo rand(100,200); ?>"><br/>
<input type="text" name="ddd" value="<?PHP echo rand(100,200); ?>"><br/>
<input type="text" name="eee" value="<?PHP echo rand(100,200); ?>"><br/>
<input type="text" name="fff" value="堃彣瀞">
<input type="submit">
</form>
PHP接收端測試範例程式碼如下
<?PHP
header("Content-Type: text/html; charset=utf-8");
include($_SERVER['DOCUMENT_ROOT'].'/admin/conn/conn.php');
include($_SERVER['DOCUMENT_ROOT'].'/admin/function/function.php');
ini_set('display_errors','1');
error_reporting(E_ALL);
?>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
<?PHP
$nowtime = time();
$wordtime = date('Y-m-d H:i:s',$nowtime);
if(isset($_POST['aaa']) && $_POST['aaa'] != ''){echo 'aaa : '.$_POST['aaa']."<br/>";$aaa=$_POST['aaa'];}else{$aaa='';}
if(isset($_POST['bbb']) && $_POST['bbb'] != ''){echo 'bbb : '.$_POST['bbb']."<br/>";$bbb=$_POST['bbb'];}else{$bbb='';}
if(isset($_POST['ccc']) && $_POST['ccc'] != ''){echo 'ccc : '.$_POST['ccc']."<br/>";$ccc=$_POST['ccc'];}else{$ccc='';}
if(isset($_POST['ddd']) && $_POST['ddd'] != ''){echo 'ddd : '.$_POST['ddd']."<br/>";$ddd=$_POST['ddd'];}else{$ddd='';}
if(isset($_POST['eee']) && $_POST['eee'] != ''){echo 'eee : '.$_POST['eee']."<br/>";$eee=$_POST['eee'];}else{$eee='';}
if(isset($_POST['fff']) && $_POST['fff'] != ''){echo 'fff : '.$_POST['fff']."<br/>";$fff=$_POST['fff'];}else{$fff='';}
echo "<hr/>";
$sql = "insert into zzzzpost (
aaa,bbb,ccc,ddd,eee,fff,dt
)values(
'".$aaa."','".$bbb."','".$ccc."','".$ddd."','".$eee."',N'".$fff."','".$wordtime."')";
$result=mssql_query($sql);
if($result){
echo 'Data Insert OK';
}else{
echo $sql.' Data Insert Error';
}
?>
透過網頁(都是UTF-8編碼)POST寫入後都會報如下圖的錯誤訊息
但是直接將SQL語法貼在SSMS執行卻可順利執行且寫入的是實體的難字...
insert into zzzzpost ( aaa,bbb,ccc,ddd,eee,fff,dt )values( '123','139','142','152','186',N'堃彣瀞','2018-02-08 23:15:21')
若我先將難字變數寫入SQL前 iconv("UTF-8","big5",'堃彣瀞') 轉碼
會由於BIG5沒這些字導致變空白....
一、不考慮修改欄位定序 (會引發一連串系統相關聯的查詢上定序相容要修改)
二、難字若改為unicode編碼寫入,擔心會否影響該欄位值的搜尋匹配
第二點測試結果存入是unicode編碼,顯示在網頁沒問題,但若搜尋匹配就有問題了...
虛心請教處理過類似問題的大德,懇請分享您的寶貴經驗....感恩
我在 mariadb 試過類似情況,看看以下網頁能否有幫助:http://php.net/manual/en/mysqli.set-charset.php