我正在嘗試重寫一個舊網站。
它是波斯語,使用波斯/阿拉伯字符。
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 "<B><Font color=red>ÎØÇ ! áØÝÇ ãÌÏøÏÇ ÊáÇÔ ˜äíÏ"; exit(); } for ($i = 0 ; $i < $db->Count() ; $i++) { $row = $db->Next(); var_dump($row); }
P粉2573421662023-11-18 09:06:47
deceze的答案非常好,但我可以添加一些信息,這些信息可能有助於處理大量記錄,而無需手動測試它們.
如果轉換 CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8)
失敗,則會列印 NULL
而不是 field_name
內容。
所以我用這個來找那些記錄:
SELECT IFNULL( CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) , '**************************************************') FROM table_name
或這個:
SELECT id, field_name, CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name WHERE CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) IS NULL
帶有該子句的 UPDATE
僅影響轉換成功的記錄:
UPDATE table_name SET field_name = CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8mb4 ) WHERE CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8mb4) IS NOT NULL
P粉6638838622023-11-18 00:37:25
簡而言之,因為這個問題之前已經討論過一千次了:
"漢字"
,以 UTF-8 編碼。該位元組為 E6 BC A2 E5 AD 97
。 latin1
的資料庫連線發送此字串。 E6 BC A2 E5 AD 97
,認為它們代表 latin1
字元。 æ¡ ¡ ¿李>
- 相反的相同過程使 PHP 接收相同的字節,然後將其視為 UTF-8。儘管資料庫沒有按應有的方式處理字符,但往返對於 PHP 來說運作得很好。
所以這裡的問題是資料錄入資料庫時資料庫連線設定不正確。您必須將資料庫中的資料轉換為正確的字元。試試這個:
SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name
也許 utf8
不是您所需要的,請試試看。如果有效,請將其變更為 UPDATE
語句以永久更新資料。