2012-12-05 64 views
1

我試圖插入非英文字符:通過PHP未能插入外語字符到DB

這裏(如約瑟夫Kricenský)到我的mysql數據庫是我的代碼

$name=addslashes("Josef Kricenský"); 
$id=1; 
mysql_query("'SET NAMES 'utf8'"); 
mysql_query("insert ignore into names (id,value) values ('$id','$name')"); 

數據是插入到表中,但它只能插入到'ý'中,即:約瑟夫Kricensk

utf8_general_ci是表格整理,MyISAM是存儲引擎,此代碼在我的其他網站上工作過,但似乎這是缺少的東西。

如果我通過phpmyadmin插入它的作品,所以我的猜測是,代碼少了點什麼,順便說一下PHP版本5.2.7是

+0

您的PHP文件是否也是UTF8?因爲如果你在一個非Unicode的純文本文件中進行編輯,那麼它的代碼非常不同。如果名字來自網頁,你確定他們編碼正確,之前(是UTF8頁面)?暫時刪除addslashes()會改變什麼嗎? – FrancescoMM

+0

這隻有在你的php頁面也有正確的編碼時纔有效。根據您使用的代碼編輯器,它們中的大多數會爲您提供一個選項,以促進不同的編碼。 –

+0

同上。另外我還做了一個「SET CHARACTER SET utf8」,除了SET NAMES utf8 - 注意我沒有在utf8中加上引號 - 不確定這可能是一個問題,但只是看我在我的代碼中做了什麼 – KevInSol

回答

0

,似乎我的機器做工精細自足例子...

<?php 
// added numeric code entity to reflect actual code of OP 
// $param = 'Josef Kricenský'; 
$param = 'Josef Kricensk&#253;'; 
$param = html_entity_decode($param , ENT_XML1, 'UTF-8'); 

// this is not how you check for utf-8 encoding 
// ...except in this simple example ;-) 
// all characters but the ý are encoded in one byte, ý uses two bytes 
// -> 16 bytes -> strlen($param) should be 16 
if (16!=strlen($param)) { 
    die("this doesn't seem to be utf-8 encoded"); 
} 

// the mysql_ api is deprecated. Take a look at e.g. http://docs.php.net/pdo for alternatives 
$mysql = mysql_connect('localhost', 'localonly', 'localonly') or die(mysql_error()); 
mysql_select_db('test', $mysql) or die(mysql_error($mysql)); 
// SET NAMES 'utf8' doesn't tell the client library about the changed encoded 
// so e.g. mysql_real_escape_string() may fail 
// see http://docs.php.net/mysql_set_charset 
mysql_set_charset('utf8', $mysql) or die(mysql_error($mysql)); 

// using a temporary table for this example... 
setup($mysql); 


// insert a record 
echo "insert a record\n"; 
$query = sprintf("INSERT INTO soFoo (name) VALUES ('%s')", 
    mysql_real_escape_string($param, $mysql) 
); 
mysql_query($query, $mysql) or die(mysql_error($mysql)); 

// retrieve the record 
echo "retrieve the record\n"; 
$result = mysql_query('SELECT name FROM soFoo', $mysql) or die(mysql_error($mysql)); 
while(false!==($row=mysql_fetch_assoc($result))) { 
    echo 'strlen($row[name])==', strlen($row['name']), "\n"; 
} 

function setup($mysql) { 
    mysql_query(' 
     CREATE TEMPORARY TABLE soFoo(
      id int auto_increment, 
      name varchar(32), 
      primary key(id) 
     ) DEFAULT CHARSET=utf8 
    ', $mysql) or die(mysql_error($mysql)); 
} 

打印

insert a record 
retrieve the record 
strlen($row[name])==16 
+0

我試圖從數據庫中獲取外部字符串,然後將其插入到另一個表中,它工作正常。但在我的實際代碼中,我使用html_entity_decode()將十六進制代碼轉換爲特殊字符,然後將其插入到表 –

+0

中,例如添加了html_entity_decode(),結果仍然相同。 – VolkerK

+0

嗨volkerk,感謝您的努力朋友,嘗試ý而不是ý html_entity_decode似乎並沒有將其轉換爲相應的字符 –

0

嘗試運行此。

<?php 

$name = "Josef Kricenský"; 
$id = 1; 

if(substr($name, 14, 2) !== "\xC3\xBD") { 
    trigger_error("This file was not saved in UTF-8. Set your text editor to save the file in UTF-8"); 
} 

//Connect to mysql 

mysql_set_charset("utf8"); 


$name_safe = "'" . mysql_real_escape_string($name) . "'"; 
$id_safe = (int)$id; 

mysql_query("insert ignore into names (id,value) values ($id_safe, $name_safe)"); 
+0

嗨Esailija感謝您的代碼,我試過了,錯誤被觸發 –

+0

@ user1878818好吧,你使用的是什麼文本編輯器? – Esailija