ホームページ  >  記事  >  バックエンド開発  >  mysql で中国語の文字化けが挿入される

mysql で中国語の文字化けが挿入される

WBOY
WBOYオリジナル
2016-06-23 14:20:35859ブラウズ

Web ページのエンコーディングは php ファイルで utf-8 に設定されます
header("Content-type: text/html; charset=utf-8");

データベースに渡されるエンコーディングは以前に utf-8 に設定されますデータベースに挿入します
$ this->mysqli->query("set names utf8");

データベースには、文字セットに関連するいくつかの変数が設定されます
クエリ後の結果には、「char%」のような変数が表示されます; は


'collat​​ion_%' のような show 変数をクエリします;結果は


WampServer を使用し、mysql 設定ファイル my.ini を変更し、[client] ノードの下にdefault-character-set=utf8 を追加します。 [mysqld] ノードの下のcharacter_set_server=utf8 次に、musql サービスを再起動します


ただし、データベースに渡されると、中国語の文字は疑問符になります。 。コード化けを解決するための設定方法を教えてください。


ディスカッションに返信 (解決策)

加えたすべての変更を元の状態に戻します。

注意事項:
1. すべての文字セット関連の設定は、データベース内の既存のデータには影響しません
2. 文字セット関連の設定は、設定後に挿入されたデータにのみ有効です
3. データベース 共有リソースです、安易に設定を変更しないでください。他のアプリケーションで問題が発生しないようにするには

次の 2 点を実行する限り、コードの文字化けの問題は発生しません
1. 中国語のコンテンツが含まれる可能性のあるすべてのフィールドを接続し、中国語の文字セットで校正する必要があります。どの文字セットであっても (gbk、utf8、ucs2 は OK)、すべてのフィールドが同じである必要はありません
2. データベースに接続した後は、毎回 set name pagecharacter set を実行します

データベースの文字を設定しただけです。収集後、データテーブル内の元の文字化けデータを削除してからプログラムを実行すると、挿入された漢字は文字化けしたままです。

練習用にテストデータベースを使用したため、文字セットの設定を変更しました。デフォルトの設定が何なのか、それを復元する方法さえ思い出せません。 。 。

データベースに接続した後、毎回 $this->mysqli->query("set names utf8"); を実行すれば問題ないはずです。
中国語のコンテンツを含む可能性のあるすべてのフィールドは、中国語の文字セットに接続して照合する必要があります。これは、'collat​​ion_%' のような show 変数の実行後に表示される結果を指しますか?

始めたばかりなのでアドバイスをお願いします、よろしくお願いします。

データベースに接続するためのツールクラス

<?php  class MysqliHelper{    private $mysqli;	private static $host = "localhost";    private static $user = "root";	private static $pwd = "";	private static $db = "test";		public function __construct(){	  $this->mysqli = new Mysqli(self::$host,self::$user,self::$pwd,self::$db);	  if($this->mysqli->connect_error){	     die("连接数据库失败".$this->mysqli->connect_error);	  }	   $this->mysqli->query("set names utf8");	}		public function execute_dql($sql){	    $res = $this->mysqli->query($sql) or die($this->mysqli->error);	    return $res;	}		public function execute_dml($sql){	     $res = $this->mysqli->query($sql) or die($this->mysqli->error);		 		 if(!$res){		    return 0;		 }else{		    if($this->mysqli->affected_rows>0){			  return 1;			}else{			  return 2;			}		 }	}  }?>


テーブルの文字セットは何ですか?保存結果には影響しないはずです~

テーブルの文字セットは何ですか?保存結果には影響しないはずです~

テーブルの文字セットを確認するにはどうすればよいですか?デフォルトの文字セットを使用しています。変更された構成については、1 階のスクリーンショットを参照してください。

テーブル table name を作成するか、phpmyadmin グラフィカル ツールを使用して表示することができます。

タイプミスです。show create table テーブル名です。

CREATE TABLE `tb_userinfo` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`password `varchar(20 ) DEFAULT NULL,
`email` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=latin1



latin1 ですが、ut f8 に変更するにはどうすればよいですか?

CREATE TABLE `tb_userinfo` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`password` varchar(20) DEFAULT NULL,
`email` varchar(20) DE FAULT NULL ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=latin1



latin1 ですが、utf8 に変更するにはどうすればよいですか

phpmyadmin と入力して変更します

元のテーブルを削除
テーブル tb_userinfo を削除

再作成
CREATE TABLE `tb_userinfo` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`password` varchar( 20 ) DEFAULT NULL、
`email` varchar(20) DEFAULT NULL、
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8

実際、これを行う必要はありません
接続と校正を変更するだけです
ALTER TABLE `tb_userinfo` CHANGE `username` `username` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL

テーブルの文字セットを変更する場合は、フィールドも変更する必要があります。テーブルを削除してからテーブルを再構築できます。

CREATE TABLE `tb_userinfo` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`password` varchar(20) DEFAULT NULL,
`email `varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8;

データを必ずバックアップしてください。実際、phpmyadmin を使用して文字化けを表示することを気にしない場合は、PHP でデータベースに接続するときに文字セットを設定するだけで済み、データ アクセスには影響しません。 。 。これが正常な場合は、Web サイトで phpmyadmin をハングさせないようにして、問題を避けるためにそのまま使用してください~~

ドロップ後にテーブルを再構築すると、テーブルの文字セットは utf8 になります
ただし、

$sql を使用してください= "insert into tb_userinfo (username ,password,email) names('sss李思','123456','lis@sina.com')";

の場合、挿入後に sss のみが表示されます。純粋な漢字では何も挿入できません。

php ファイルを utf-8 BOM フリー形式で保存します

ついに成功しました、皆さん本当にありがとう。現在、メモ帳で作成したphpドキュメントのデフォルトのエンコードがANSIになっているので練習中です。

でも、毎回こんなに面倒な設定をしなければいけないのでしょうか?
mysqlが中国語対応するのは面倒な気がします。変更する必要のない場所がいくつかあるかもしれませんが、変更したのですが、どの設定を変更する必要があるかわかりません。

my.ini のパラメータを変更する必要はありません (もちろん、テーブルが gbk の場合は gbk になります)。他に、挿入されたデータのエンコーディングがデータベース内のエンコーディングと一致していることを確認する必要がありますか?

Linux でのみ utf-8 を使用できるため、人々は utf-8 を使用します
ウィンドウの下にいる場合、デフォルトは gbk です。utf-8 を使用すると、面倒なことになるのではないでしょうか。

国際化のためにutf-8が使われているという人もいますが、実際のところ、四角文字を理解できる外国人はどれだけいるのでしょうか?

皆様、改めてありがとうございます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。