存储的数据奇怪的字符编码,旧的脚本显示他们罚款新的没有
我正在尝试重写一个旧网站。
它是使用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',
在数据库设置中,那里没有问题。
所以这里是奇怪的部分
旧的脚本正在使用某种名为TUBADBENGINE
或TUBA 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); }
总之,因为这已经被讨论了上千次:
- PHP持有一个string,比如说
"漢字"
,用UTF-8编码。 这个字节是E6 BC A2 E5 AD 97
。 - 它通过设置为
latin1
的数据库连接发送此string。 - 数据库接收字节
E6 BC A2 E5 AD 97
,认为这些代表latin1
字符。 - 数据库存储字符(
E6 BC A2 E5 AD 97
在latin1
映射的字符)。 - 相同的过程反过来使PHP接收相同的字节,然后将其视为UTF-8。 PHP的往返工作正常,尽pipe数据库不应该像处理字符一样。
所以这里的问题是当数据input数据库时数据库连接设置不正确。 您必须将数据库中的数据转换为正确的字符。 尝试这个:
SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name
也许utf8
不是你在这里需要的,试验。 如果UPDATE
,请将其更改为UPDATE
语句以永久更新数据。