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

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

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

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 "<B><Font color=red>ÎØÇ ! áØÝÇ ãÌÏøÏÇ ÊáÇÔ ˜äíÏ";  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學習者快速成長!