Maison  >  Article  >  Les sujets  >  Comment résoudre le code chinois tronqué dans php mysql ?

Comment résoudre le code chinois tronqué dans php mysql ?

青灯夜游
青灯夜游original
2020-11-03 13:53:284473parcourir

Solution au code tronqué chinois php mysql : utilisez d'abord la balise méta pour définir "l'encodage de la déclaration de page" sur GB2312 et UTF-8 ; puis utilisez mysql_query() pour définir "l'encodage de la connexion à la base de données" et assurez-vous que "Encodage de déclaration de page" Il peut être cohérent avec "l'encodage de connexion à la base de données".

Comment résoudre le code chinois tronqué dans php mysql ?

Tutoriels recommandés : Tutoriel vidéo MySQL, Tutoriel vidéo PHP

De manière générale, il y a deux raisons à l'apparition de caractères tronqués. Premièrement, cela est dû à une erreur dans le paramètre d'encodage (charset), ce qui amène le navigateur à analyser avec un mauvais encodage, ce qui entraîne un "livre céleste" désordonné. " qui remplit l'écran. Deuxièmement, le fichier est ouvert, puis enregistré dans le mauvais encodage. Par exemple, un fichier texte a été initialement encodé en GB2312, mais il a été ouvert en encodage UTF-8 puis enregistré. Pour résoudre le problème de code tronqué ci-dessus, vous devez d'abord savoir quels aspects du développement impliquent l'encodage :

1 Encodage du fichier : fait référence à l'encodage dans lequel le fichier d'échange (.html, .php, etc.) lui-même est sauvé. Le Bloc-notes et Dreamweaver reconnaîtront automatiquement l'encodage du fichier lors de l'ouverture de la page, il y aura donc moins de problèmes. Cependant, ZendStudio ne reconnaît pas automatiquement l'encodage. Il ouvrira uniquement le fichier dans un certain encodage en fonction de la configuration des préférences. Si vous ouvrez accidentellement le fichier avec un mauvais encodage pendant le travail, des caractères tronqués apparaîtront dès que vous enregistrez. après avoir effectué la modification.

2. Encodage de la déclaration de page : Dans le code HTML HEAD, vous pouvez utiliser e8b088d6bcb59096041b1c501b34c57e (ce phrase Il doit être écrit devant b2386ffb911b14667cb8f0f91ea547a7XXX6e916e0f7d1e588d4f442bf645aedb2f, sinon la page sera vide (IE+PHP uniquement)) pour indiquer au navigateur quel encodage la page Web utilise actuellement. le développement sont deux encodages GB2312 et UTF-8

3. Encodage de connexion à la base de données : fait référence à l'encodage utilisé pour transmettre des données à la base de données lors de l'exécution d'opérations de base de données. Il convient de noter ici qu'il ne doit pas être confondu avec. l'encodage de la base de données elle-même, comme MySQL. La valeur interne par défaut est l'encodage latin1, ce qui signifie que Mysql stocke les données en encodage latin1. Les données transmises à Mysql dans d'autres encodages seront converties en encodage latin1

Je sais. où l'encodage est impliqué dans le développement WEB. Nous connaissons également la cause des caractères tronqués : les trois paramètres d'encodage ci-dessus sont incohérents puisque la plupart des différents encodages sont compatibles avec l'ASCII, les symboles anglais n'apparaîtront pas et les caractères chinois n'auront pas de chance ici. Voici quelques situations d'erreur courantes et solutions :

1. La base de données utilise le codage UTF8 et le codage de la déclaration de page est GB2312. Il s'agit de la cause la plus courante de caractères tronqués à l'heure actuelle, les données sont directement SÉLECTIONNÉES. dans le script PHP est tronqué et doit être utilisé avant l'interrogation. :

mysql_query("SET NAMES GBK");
//或
mysql_query("SET NAMES GB2312");

pour définir l'encodage de la connexion MYSQL et garantir que l'encodage de la déclaration de page est cohérent avec l'encodage de la connexion défini ici (GBK est une extension de GB2312). Si la page est encodée en UTF-8, vous pouvez utiliser :

mysql_query("SET NAMES UTF8");

Notez qu'il s'agit d'UTF8 au lieu de l'UTF-8 couramment utilisé si l'encodage déclaré sur la page est cohérent avec l'encodage interne. Encodage de la base de données, l'encodage de connexion n'est pas requis.

Remarque : En fait, l'entrée et la sortie des données de MYSQL sont plus rapides que ce qui précède. Pour faire plus compliqué, 2 encodages par défaut sont définis dans MYSQL. fichier de configuration my.ini, qui sont le jeu de caractères par défaut dans [client] et le jeu de caractères par défaut dans [mysqld] pour définir respectivement le client par défaut. L'encodage utilisé dans la connexion finale et la base de données. spécifié ci-dessus est en fait le paramètre de ligne de commande caractère_set_client lorsque le client MYSQL se connecte au serveur, pour indiquer au serveur MYSQL quel est l'encodage des données client reçues, au lieu d'utiliser l'encodage par défaut

2. est incohérent avec l'encodage du fichier lui-même. Cela arrive rarement, car si l'encodage est incohérent, ce que l'artiste voit dans le navigateur lors de la création de la page est plus susceptible d'être modifié après la publication, provoqué par l'ouverture du fichier. page dans le mauvais encodage, puis enregistrez-la. Ou vous utilisez un logiciel FTP pour modifier directement des fichiers en ligne, tel que CuteFTP. En raison d'une configuration d'encodage logicielle incorrecte, un encodage incorrect est converti.

3. Certains amis qui louent des hôtes virtuels, même si les trois encodages ci-dessus sont correctement définis, il y a toujours des caractères tronqués. Par exemple, si la page Web est codée en GB2312, elle est toujours reconnue comme UTF-8 lorsqu'elle est ouverte par des navigateurs tels que IE. Le HEAD de la page Web a déjà indiqué qu'il s'agit de GB2312 après avoir modifié manuellement le codage du navigateur en GB2312. , la page s'affiche normalement. La raison en est que le serveur Apache définit l'encodage global par défaut du serveur et ajoute AddDefaultCharset UTF-8 dans httpd.conf. A ce moment, le serveur enverra d'abord l'en-tête HTTP au navigateur, et sa priorité est supérieure à l'encodage déclaré dans la page. Naturellement, le navigateur ne le reconnaîtra pas correctement. Il existe deux solutions. Les administrateurs doivent ajouter AddDefaultCharset GB2312 au fichier de configuration de leur propre machine virtuelle pour remplacer la configuration globale, ou la configurer en .htaccess dans leur propre répertoire.

Solution aux codes tronqués

Pour résoudre le problème du code tronqué, vous devez d'abord déterminer quel encodage votre base de données utilise. S'il n'est pas spécifié, la valeur par défaut est latin1.

Les trois jeux de caractères que nous utilisons le plus devraient être gb2312, gbk et utf8.

那么我们如何去指定数据库的字符集呢?下面也gbk为例

【在MySQL Command Line Client创建数据库】

mysql> CREATE TABLE `mysqlcode` (
    -> `id` TINYINT( 255 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    -> `content` VARCHAR( 255 ) NOT NULL
    -> ) TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> desc mysqlcode;
+---------+-----------------------+------+-----+---------+----------------+
| Field   | Type                  | Null | Key | Default | Extra          |
+---------+-----------------------+------+-----+---------+----------------+
| id      | tinyint(255) unsigned | NO   | PRI |         | auto_increment |
| content | varchar(255)          | NO   |     |         |                |
+---------+-----------------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)

其中后面的TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;

就是指定数据库的字符集,COLLATE (校勘),让mysql同时支持多种编码的数据库。

当然我们也可以通过如下指令修改数据库的字符集

alter database da_name default character set 'charset'.

客户端以 gbk格式发送 ,可以采用下述配置:

SET character_set_client='gbk'
SET character_set_connection='gbk'
SET character_set_results='gbk'

这个配置就等价于 SET NAMES 'gbk'。

现在对刚才创建的数据库操作

mysql> use test;
Database changed
mysql> insert into mysqlcode values(null,'php爱好者');
ERROR 1406 (22001): Data too long for column 'content' at row 1

没有指定字符集为gbk,插入时出错

mysql> set names 'gbk';
Query OK, 0 rows affected (0.02 sec)

指定字符集为 gbk

mysql> insert into mysqlcode values(null,'php爱好者');
Query OK, 1 row affected (0.00 sec)

插入成功

mysql> select * from mysqlcode;
+----+-----------+
| id | content   |
+----+-----------+
| 1  | php爱好着 |
+----+-----------+
1 row in set (0.00 sec)

在没有指定字符集gbk时读取也会出现乱码,如下

mysql> select * from mysqlcode;
+----+---------+
| id | content |
+----+---------+
| 1  | php???  |
+----+---------+
1 row in set (0.00 sec)

【在phpmyadmin创建数据库,并指定字符集】

表类型根据自己需要选,这里选MyISAM(支持全文检索);
整理选择 gbk_chinese_ci 也就是gbk字符集
gbk_bin 简体中文, 二进制。gbk_chinese_ci 简体中文, 不区分大小写。

在刚才创建的数据库插入数据库

再浏览时发现是乱码

为什么呢?是因为数据库为gbk字符集,而我们操作时没有指定为gbk

回到数据库首页

可以看到 mysql 连接校对默认的latin1_bin。我们将其改为gbk_chinese_ci

再插入一条数据。看,这条已经正常了

【解决php读取数据库乱码】

仍以数据库mysqlcode为例 

<?php 
$conn = mysql_connect("localhost","root","89973645"); 
mysql_query("set names &#39;gbk&#39;");//这就是指定数据库字符集,一般放在连接数据库后面就系了 
mysql_select_db("test"); 
 
$sql = "select * from mysqlcode"; 
$result = mysql_query($sql,$conn); 
 
?> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<title>mysql 字符编码</title> 
</head> 
 
<body> 
<table width="300" height="32" border="1" align="center" cellpadding="0" cellspacing="0"> 
 <tr> 
    <td width="71" align="center">id</td> 
    <td width="229" align="center">内容</td> 
 </tr> 
 <?php while($row = mysql_fetch_assoc($result)){ 
 echo "   
 <tr> 
    <td align=/"center/">".$row[&#39;id&#39;]."</td> 
    <td>".$row[&#39;content&#39;]."</td> 
 </tr>"; 
}?>   
</table> 
</body> 
</html> 
<?php mysql_free_result($result);?>

 如果我们将mysql_query("set names 'gbk'");注释掉,肯定时乱码

加上那句又正常了

一句

你数据库用什么编码,在对数据库操作之前就set names '你的编码';

更多编程相关知识,请访问:编程学习网站!!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn