新標題:新腳本無法正確顯示儲存資料的奇怪字元編碼
P粉337385922
P粉337385922 2023-11-17 10:51:01
0
2
724

我正在嘗試重寫一個舊網站。

它是波斯語,使用波斯/阿拉伯字符。

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',

在資料庫設定中,所以沒有問題。

所以這是奇怪的部分

舊腳本使用某種名為TUBADBENGINETUBA 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); }


#
P粉337385922
P粉337385922

全部回覆 (2)
P粉257342166

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粉663883862

    簡而言之,因為這個問題之前已經討論過一千次了:

    1. PHP 保存一個字串,例如"漢字",以 UTF-8 編碼。該位元組為E6 BC A2 E5 AD 97
    2. 它透過設定為latin1資料庫連線發送此字串。
    3. 資料庫收到位元組E6 BC A2 E5 AD 97,認為它們代表latin1字元。
    4. 資料庫儲存字元æ¡ ¡ ¿李>
    5. 相反的相同過程使 PHP 接收相同的字節,然後將其視為 UTF-8。儘管資料庫沒有按應有的方式處理字符,但往返對於 PHP 來說運作得很好。

    所以這裡的問題是資料錄入資料庫時資料庫連線設定不正確。您必須將資料庫中的資料轉換為正確的字元。試試這個:

    SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name

    也許utf8不是您所需要的,請試試看。如果有效,請將其變更為UPDATE語句以永久更新資料。

      最新下載
      更多>
      網站特效
      網站源碼
      網站素材
      前端模板
      關於我們 免責聲明 Sitemap
      PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!