关于ZAKER 融媒体解决方案 合作 加入

php – 存储数据的奇怪字符编码 , 旧脚本显 .

CocoaChina 09-18

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

它是在波斯语中使用 perso / arabic 字符 .

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

当我使用旧脚本在数据库 ( 波斯语 ) 中输入一些数据时 , 当我查看数据库时 , 字符存储如 ??? … ? ± ? § ??.

旧脚本 fetch / 显示数据正常 , 但新脚本使用与数据库相同的奇怪字体 / 字符集显示它们

因此 , 当我输入 ???? 时 , 数据库存储的数据看起来像 ??? … ? ± ? § ?, 当我在新脚本中获取它时 , 我看到 ??? … ? ± ? § ? 但是在旧脚本中我看到了 ????

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

另一方面 , 当我直接在数据库中输入 ????? 时

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

新脚本显示正常

但在旧剧本中我得到 ????

任何人都可以对此有任何意义吗?

这是大号发动机

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 包含一个字符串 , 比如说 " 汉字 ", 用 UTF-8 编码 . 其字节为 E6 BC A2 E5 AD 97.

> 它通过设置为 latin1 的数据库连接发送此字符串 .

> 数据库接收字节 E6 BC A2 E5 AD 97, 认为那些代表 latin1 字符 .

> 数据库存储字符 ??? ( E6 BC A2 E5 AD 97 在 latin1 中映射的字符 ) .

> 相反的过程使得 PHP 接收相同的字节 , 然后将其视为 UTF-8. 即使数据库没有按原样处理字符 , 往返也适用于 PHP.

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

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

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

以上内容由"CocoaChina"上传发布 查看原文
相关标签 数据库

觉得文章不错,微信扫描分享好友

扫码分享