存储数据的字符编码出现了奇怪的问题,旧脚本可以正常显示它们,而新脚本却不能。

12 浏览
0 Comments

存储数据的字符编码出现了奇怪的问题,旧脚本可以正常显示它们,而新脚本却不能。

我正在尝试重写一个旧网站。

它是用波斯语编写的,使用波斯/阿拉伯字符。

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的数据库引擎……没有什么特别的。

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

旧脚本可以正确获取/显示该数据,但新脚本显示与数据库相同的奇怪字体/字符集。

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

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

0
0 Comments

问题出现的原因是数据库连接设置错误,导致数据以错误的字符编码存储在数据库中。解决方法是将数据库中的数据转换为正确的字符编码。可以使用以下SQL语句进行转换:

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

如果需要的不是utf8编码,可以进行实验尝试。如果转换成功,可以将这个语句改为UPDATE语句,永久更新数据。

如果要对数据库中的每个字段进行转换,最简单的方法可能是将数据库导出,然后使用正确/错误的字符集组合重新导入。

0
0 Comments

奇怪的字符编码的存储数据问题,旧脚本可以正确显示,而新脚本则无法正确显示。出现这个问题的原因是因为存储的数据使用了奇怪的字符编码,导致新脚本无法正确解析。解决方法是使用转换函数将存储的数据转换成正确的字符编码。

在这里提供了一些查询语句来找到出现问题的记录。首先可以使用以下语句来查找转换失败的记录:

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

通过以上方法,我们可以解决奇怪字符编码的存储数据问题,并确保新脚本能够正确显示这些数据。

0