存储数据的奇怪字符编码,老脚本展示他们漂亮的新一不存储数据的奇怪字符编码,老脚本展示他们漂亮的新一不

2019-05-08 22:24发布

我试图重写一个旧的网站。
它在波斯湾它采用perso /阿拉伯字符。

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

几乎所有我的表/列COLLATE设置为utf8_persian_ci

我用笨我的新剧本,我有

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

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

当然,我也有同样اااا存储在数据库中

新的脚本显示它精细

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

任何人都可以做的这个任何意义?

下面是大号ENGIN

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

Answer 1:

总之,因为这个已经讨论了一千次之前:

  1. PHP拥有一个字符串,说"漢字" ,在UTF-8编码。 造成这种情况的字节是E6 BC A2 E5 AD 97
  2. 它发出这个字符串其上设置了一个数据库连接latin1
  3. 数据库接收该字节E6 BC A2 E5 AD 97 ,以为那些代表latin1字符。
  4. 数据库存储的字符æ¼¢å (该字符E6 BC A2 E5 AD 97映射到latin1 )。
  5. 反转相同的过程使得PHP接收相同的字节,它然后把为UTF-8。 往返于PHP工作正常,即使它应该数据库不治疗的字符。

因此,这里的问题是,数据库连接设置不正确,当数据被输入到数据库中。 你必须对数据库中的数据转换为正确的字符。 试试这个:

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

也许utf8是不是你需要的东西在这里,实验。 如果这样的作品,改变这种到UPDATE语句来永久更新数据。



文章来源: strange character encoding of stored data , old script is showing them fine new one doesn't