首頁  >  問答  >  主體

儲存資料的奇怪字元編碼,舊腳本顯示它們很好,新腳本卻沒有

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

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

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مران

舊腳本取得/顯示資料正常,但新腳本使用與資料庫相同的奇怪字體/字元集顯示它們

因此,當我輸入rather 時,資料庫儲存的資料看起來像Ø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');

另一方面,當我直接在資料庫中輸入???

當然,我在資料庫中儲存了相同的rather

#

新腳本顯示效果很好

但是在舊腳本中我得到? ? ?

任何人都可以理解這一點嗎?

這是大號引擎

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粉141455512P粉141455512283 天前337

全部回覆(2)我來回復

  • P粉295616170

    P粉2956161702024-01-11 16:03:06

    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

    回覆
    0
  • P粉920835423

    P粉9208354232024-01-11 13:05:48

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

    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 語句以永久更新資料。

    回覆
    0
  • 取消回覆