存储的数据奇怪的字符编码,旧的脚本显示他们罚款新的没有

我正在尝试重写一个旧网站。
它是使用perso /阿拉伯字符的波斯语。

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 …没什么特别的。

当我使用旧脚本在数据库(波斯语)中input一些数据时,当我查看数据库时,字符被存储为عمران

旧脚本获取/显示数据正常,但新脚本显示与数据库相同的怪异字体/字符集

所以,当我inputاااا ,数据库存储的数据看起来像عمرا٠,当我在新脚本中获取它我看到عمراÙ但在旧的脚本我看到اااا

 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'); 

另一方面,当我直接在数据库中inputااااا

当然,我有相同的数据库中存储的اااا

新脚本显示正常

但在旧的脚本我得到了????

任何人都可以有这个意义吗?

这是大号机

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); } 

总之,因为这已经被讨论了上千次:

  1. PHP持有一个string,比如说"漢字" ,用UTF-8编码。 这个字节是E6 BC A2 E5 AD 97
  2. 它通过设置为latin1数据库连接发送此string。
  3. 数据库接收字节E6 BC A2 E5 AD 97 ,认为这些代表latin1字符。
  4. 数据库存储字符( E6 BC A2 E5 AD 97latin1映射的字符)。
  5. 相同的过程反过来使PHP接收相同的字节,然后将其视为UTF-8。 PHP的往返工作正常,尽pipe数据库不应该像处理字符一样。

所以这里的问题是当数据input数据库时​​数据库连接设置不正确。 您必须将数据库中的数据转换为正确的字符。 尝试这个:

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

也许utf8不是你在这里需要的,试验。 如果UPDATE ,请将其更改为UPDATE语句以永久更新数据。