存储数据的字符编码出现了奇怪的问题,旧脚本可以正常显示它们,而新脚本却不能。
存储数据的字符编码出现了奇怪的问题,旧脚本可以正常显示它们,而新脚本却不能。
我正在尝试重写一个旧网站。
它是用波斯语编写的,使用波斯/阿拉伯字符。
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
的数据库引擎……没有什么特别的。
当我使用旧脚本将一些数据(用波斯语)输入数据库时,当我查看数据库时,字符存储为عمران
。
旧脚本可以正确获取/显示该数据,但新脚本显示与数据库相同的奇怪字体/字符集。
所以当我输入اااا
时,数据库存储的数据看起来像عمراÙ
,当我在新脚本中提取它时,我看到عمراÙ
,但在旧脚本中我看到اااا
。
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');
另一方面,当我直接在数据库中输入ااااا
当然,我在数据库中存储了相同的اااا
新脚本可以正确显示它
但在旧脚本中,我得到????
有人能理解这是什么意思吗?
这是tuba引擎
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 "ÎØÇ ! áØÝÇ ãÌÏøÏÇ ÊáÇÔ ˜äíÏ"; exit(); } for ($i = 0 ; $i < $db->Count() ; $i++) { $row = $db->Next(); var_dump($row); }
奇怪的字符编码的存储数据问题,旧脚本可以正确显示,而新脚本则无法正确显示。出现这个问题的原因是因为存储的数据使用了奇怪的字符编码,导致新脚本无法正确解析。解决方法是使用转换函数将存储的数据转换成正确的字符编码。
在这里提供了一些查询语句来找到出现问题的记录。首先可以使用以下语句来查找转换失败的记录:
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
通过以上方法,我们可以解决奇怪字符编码的存储数据问题,并确保新脚本能够正确显示这些数据。