我正在嘗試重寫一個舊網站。
它是波斯語,使用波斯/阿拉伯字符。
CREATE DATABASE `db` DEFAULT CHARACTER SET utf8 COLLATE utf8_persian_ci; USE `db`;
幾乎所有我的表格/欄位 COLLATE 都設定為utf8_persian_ci
我正在為我的新腳本使用 codeigniter,並且我已經
'char_set' => 'utf8', 'dbcollat' => 'utf8_persian_ci',
在資料庫設定中,所以沒有問題。
所以這是奇怪的部分
舊腳本使用某種名為TUBADBENGINE
或TUBA DB ENGINE
的資料庫引擎...沒什麼特別的。
當我使用舊腳本在資料庫中輸入一些資料(波斯語)時,當我查看資料庫時,字元儲存為Ø1مران
。
舊腳本取得/顯示資料正常,但新腳本使用與資料庫相同的奇怪字體/字元集顯示它們
因此,當我輸入???
時,資料庫儲存的資料看起來像Ø1Ù...راÙ
,當我在新腳本中取得它時,我看到Ø1Ù...راÙ
但在舊腳本中我看到#??
CREATE TABLE IF NOT EXISTS `tnewsgroups` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `fName` varchar(200) COLLATE utf8_persian_ci DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=11 ; -- -- Dumping data for table `tnewsgroups` -- INSERT INTO `tnewsgroups` (`ID`, `fName`) VALUES (1, 'عمران'), (2, 'معماری'), (3, 'برق'), (4, 'مکانیک'), (5, 'test'), (6, 'test2');
另一方面,當我直接在資料庫中輸入???
時
當然,我在資料庫中儲存了相同的???
新腳本顯示效果很好
但是在舊腳本中我得到????
任何人都可以理解這一點嗎?
這是大號引擎
https://github.com/maxxxir/mz-codeigniter-crud/blob/master/tuba.php
舊腳本的使用範例:
define("database_type" , "MYSQL"); define("database_ip" , "localhost"); define("database_un" , "root"); define("database_pw" , ""); define("database_name" , "nezam2"); define("database_connectionstring" , ""); $db = new TUBADBENGINE(database_type , database_ip , database_un , database_pw , database_name , database_connectionstring); $db->Select("SELECT * FROM tnews limit 3"); if ($db->Lasterror() != "") { echo "ÎØÇ ! áØÝÇ ãÌÏøÏÇ ÊáÇÔ ˜äíÏ"; exit(); } for ($i = 0 ; $i < $db->Count() ; $i++) { $row = $db->Next(); var_dump($row); }
deceze的答案非常好,但我可以添加一些信息,這些信息可能有助於處理大量記錄,而無需手動測試它們.
如果轉換
CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8)
失敗,則會列印NULL
而不是field_name
內容。所以我用這個來找那些記錄:
或這個:
帶有該子句的
UPDATE
僅影響轉換成功的記錄:簡而言之,因為這個問題之前已經討論過一千次了:
"漢字"
,以 UTF-8 編碼。該位元組為E6 BC A2 E5 AD 97
。latin1
的資料庫連線發送此字串。E6 BC A2 E5 AD 97
,認為它們代表latin1
字元。æ¡ ¡ ¿李>
相反的相同過程使 PHP 接收相同的字節,然後將其視為 UTF-8。儘管資料庫沒有按應有的方式處理字符,但往返對於 PHP 來說運作得很好。
所以這裡的問題是資料錄入資料庫時資料庫連線設定不正確。您必須將資料庫中的資料轉換為正確的字元。試試這個:
也許
utf8
不是您所需要的,請試試看。如果有效,請將其變更為UPDATE
語句以永久更新資料。