Maison >développement back-end >Problème PHP >Comment définir l'encodage Oracle en php

Comment définir l'encodage Oracle en php

藏色散人
藏色散人original
2021-10-15 11:01:441523parcourir

Comment définir l'encodage Oracle en PHP : 1. Obtenez le jeu de caractères d'Oracle ; 2. Exécutez "select * from V$NLS_PARAMETERS;" 3. Convertissez l'encodage via la fonction iconv.

Comment définir l'encodage Oracle en php

L'environnement d'exploitation de cet article : système Windows 7, PHP version 7.1, ordinateur DELL G3

Comment définir l'encodage Oracle en php ?

php se connecte à Oracle pour définir le jeu de caractères à éviter caractères tronqués

Utilisez Oracle pour la base de données, lorsque php se connecte à Oracle, il est préférable de spécifier le jeu de caractères.

Vérifiez le manuel PHP, le quatrième paramètre de oci_connect est charset, c'est la clé.

Récupérez d'abord le jeu de caractères d'Oracle et exécutez "select * from V$NLS_PARAMETERS;". La variable NLS_CHARACTERSET correspond au jeu de caractères dont nous avons besoin. Par exemple, ici c'est "ZHS16GBK". Par conséquent, le code PHP final est :

$c1 = oci_connect("scott", "tiger", $db, 'zhs16gbk');

Mes fichiers PHP locaux utilisent utf-8, le code obtenu doit donc subir la conversion d'encodage suivante :

while ($dat = oci_fetch_row($cur)) {
  print_r(iconv('gb2312', 'utf-8', $dat[0]));
}

Mise à jour :

Des collègues ont dit qu'Oracle peut être spécifié par le client. le jeu de caractères fournit des données. En d'autres termes, si mon fichier PHP local utilise UTF-8, alors lorsque j'utilise oci_connect, je peux directement spécifier utf-8, et même la conversion d'encodage sera enregistrée.

$c1 = oci_connect("scott", "tiger", $db, 'UTF8');

De plus, il y a un problème étrange : l'iconv converti par l'encodage précédent est normal dans l'environnement de la machine de test, mais il ne peut pas être analysé normalement lorsqu'il est transmis à l'emplacement distant. Plus tard, il a été remplacé par mb_convert_encoding. est la suivante :

$nickname = mb_convert_encoding($dat[0], 'utf-8', 'gbk');

La raison possible est que si "//IGNORE" est ajouté au deuxième paramètre dans iconv, veuillez vous référer à http://cn2.php.net/manual/en/function.iconv.php. Si vous êtes intéressé, vous pouvez l'essayer, mais je ne l'essaierai pas

De plus, je joins une méthode auto-packagée d'interrogation des données Oracle en PHP DingSql :

/**
* 封装接入oracle 执行sql语句查询
* @param sql
* @return false or string or array(array())
* @author xzz  2018年5月5日上午9:38:54
*/
function DingSql($sql = ''){
    header("Content-type: text/html; charset=utf-8");
    if(!$sql) return false;
    $conn= oci_connect('name', 'passwd', 'IP:PORT/serverName','zhs16gbk');
    if($conn) {
        $stid = oci_parse($conn, $sql); // 配置SQL语句,准备执行
        if (!$stid) {
            $e = oci_error($conn);
            print htmlentities($e['message']);
            exit;
        }
        $r = oci_execute($stid, OCI_DEFAULT); // 执行SQL。OCI_DEFAULT表示不要自动commit
        if(!$r) {
            $e = oci_error($stid);
            echo htmlentities($e['message']);
            exit;
        }
    
        $kkk = [];
        $i = '-1';
        while($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {//返回关联数据并创建null
            $i++;
            foreach($row as $key => $item) {
                $kkk[$i][$key] = iconv("gb2312", "utf-8//TRANSLIT", $item);
            }
        }
        oci_close($conn);
        return $kkk;    //二维关联数组
    }else{
        echo '连接oracle失败!';exit;
    }
}

Apprentissage recommandé : "Tutoriel vidéo PHP "

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