Neuer Titel: Neues Skript zeigt seltsame Zeichenkodierung gespeicherter Daten nicht korrekt an
P粉337385922
P粉337385922 2023-11-17 10:51:01
0
2
866

Ich versuche, eine alte Website neu zu schreiben.

Es ist auf Persisch und verwendet persische/arabische Zeichen.

CREATE DATABASE `db` DEFAULT CHARACTER SET utf8 COLLATE utf8_persian_ci;
USE `db`;

Bei fast allen meinen Tabellen/Spalten ist COLLATE auf utf8_persian_ci

eingestellt

Ich verwende Codeigniter für mein neues Skript und habe

'char_set' => 'utf8',
'dbcollat' => 'utf8_persian_ci',

In den Datenbankeinstellungen also kein Problem.

Hier ist also der seltsame Teil

Das alte Skript verwendete eine Art Datenbank-Engine namens TUBADBENGINETUBA DB ENGINE... nichts Besonderes.

Als ich mit einem alten Skript einige Daten (auf Farsi) in die Datenbank eingegeben habe und mir die Datenbank angesehen habe, wurden die Zeichen als Ø1مران gespeichert.

Das alte Skript ruft die Daten gut ab bzw. zeigt sie an, aber das neue Skript zeigt sie mit der gleichen seltsamen Schriftart/dem gleichen Zeichensatz wie die Datenbank an

Also, wenn ich tippe ??? 时,数据库存储的数据看起来像 Ø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');

Andererseits, wenn ich ??? direkt in die Datenbank

eingebe

Das Gleiche habe ich natürlich auch in der Datenbank hinterlegt ???

Das neue Skript wird sehr gut angezeigt

Aber im alten Drehbuch bekomme ich ????

Kann das jemand verstehen?

Das ist ein großer Motor

https://github.com/maxxxir/mz-codeigniter-crud/blob/master/tuba.php

Verwendungsbeispiel eines alten Skripts:

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

Antworte allen(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 语句以永久更新数据。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage