3

さて、Steam Web API からニックネームを取得し、それらを mysql データベースに挿入する php スクリプトを取得しました。それらの多くは、珍しいロシア語とギリシャ語の文字を取得しました. 私はphp.iniとすべてのphpファイルでphpをutf-8に設定しました

mb_internal_encoding('utf-8');

PDO コネクタが utf8 を処理するように構成されている

$connection = new PDO('mysql:host=localhost;dbname=d2bd;mysql:charset=utf8mb4', 'root', '');
$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$connection->setAttribute(PDO::ATTR_PERSISTENT, true);
$connection->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'");

私のmysqlデータベースはutf8mb4で適切に構成されています

character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8
character_sets_dir C:\xampp\mysql\share\charsets\
collation_connection utf8mb4_unicode_ci
collation_database utf8mb4_unicode_ci
collation_server utf8mb4_unicode_ci
completion_type NO_CHAIN
concurrent_insert AUTO
connect_timeout 10
core_file OFF

簡単に言うと、web-api の入力を受け取り、uft8_encode() でエンコードします。次に、それをデータベースに挿入します。問題は、一部の文字が適切にエンコードされておらず、データベースからそれらを思い出すと、すべてバグが発生していることです。

例 1:

1.入力 ->

2.エンコード -> ÐеÑÑанÑкий ÑеÑÑовÑки

3.DBに挿入

4.DBから選択 -> Ð?еÑ?Ñ?анÑкий Ñ?еÑ?Ñ?овÑкÐ

5.デコード

6.出力 -> �?е�?�?анский �?е�?�?овск�</p>

例 2:

1.入力 -> $ |/| 1 ↓_ € ♥ J

2.エンコード -> $ |/| 1 â_ ⬠⥠J

3.DBに挿入

4.DBから選択 -> 1 â??_ â?¬ â?¥ J

5.デコード

6.出力 -> 1 �??_ �?� �?� J

4

2 に答える 2

13

文字/文字セット/照合に関する問題のチェックリスト

を含むmysql, mysqli,PDO


コンテンツ

  1. 免責事項
  2. DB 内の挿入が正しく機能しません! 私に何ができる?
  3. データベースまたはテーブルの文字セットと照合順序を変更する
  4. スクリプト ファイルのエンコーディングを設定する
  5. ページの文字セットを php または meta タグで設定します
  6. UTF8 と UTF8mb4 の違いは何ですか?
  7. この特定の質問への回答
  8. 詳細情報/追加リンク
  9. サイドノート


1.免責事項

この回答は、この質問に答えるだけでなく、回答がもう少し広範である必要があるため、より多くの人がバンドルされた適切な回答をより迅速に見つけることができます!

!重要なお知らせ!
データベースで何かを変更した場合は、常にデータベースのバックアップがあることを確認してください! 2回か3回チェックしてください!

エラー修正など、改善やコメントを受け付けています。
さらに、文法が完璧でない場合はお詫び申し上げます: D


次のような質問に行き詰まった場合:

  • Php + Mysql (UTF-8, utf8mb4) 一部の文字はまだバグ
  • MySQL データベースの文字セットと照合順序全体を UTF-8 に変換する方法は?
  • UTF-8 を MySQL に挿入しようとすると「文字列値が正しくありません」
  • my.cnf で MySQL のデフォルト文字セットを UTF-8 に変更しますか?
  • php と mysql で utf8mb4 を使用する
  • PDO + MySQL と壊れた UTF-8 エンコーディング
  • PHP Mysqlの挿入データのエラー
  • PHP PDO: 文字セット、セット名?
  • MySQLでSET NAMES utf8?
  • PHP mysql charset utf8 の問題
  • ずっとUTF-8
  • PHP を使用して MySQL から utf8mb4 データを操作する
  • エラー 1115 (42000): 不明な文字セット: mysql の 'utf8mb4'

...それなら、私の答えが役に立つかもしれません!


2. DB 内の挿入が正しく機能しません。私に何ができる?

挿入が適切に機能せず、挿入されたデータがデータベースで次のようになっている場合、さまざまな理由が考えられます。

例:

??????????

�??_ �?�
â_ ⬠⥠J

以下は、すべてが正しいかどうかを確認するための小さなチェックリストです。(チェックリストの後に、 、および
に関するいくつかの追加情報があります)mysqlmysqliPDO


チェックリスト:

  • テーブル、クライアント、サーバー、およびテキスト フィールドにデフォルトの文字セットが設定されていることを確認する
    • そうでない場合は、ポイント 3 を参照してください
  • データベース接続の文字セットを確認してください
    • IF NOT 参照ポイント mysql/PDO
  • ドキュメントの文字セットが設定されているデータを表示しているかどうかを確認してください。
    • IF NOT ポイント 5 を参照
  • スクリプト ファイルが正しい文字セットで保存されていることを確認してください。
    • IF NOT ポイント 4 を参照
  • キャラクターと文字セットを必ず設定してください。
    • IF NOT 参照ポイント mysql/PDO
  • フォームが utf8 を受け入れることを確認してください!
    • IF NOT ポイント 5 を参照
  • 接続エンコーディングが設定されていることを確認してください
    • IF NOT 参照ポイント mysql/pdo
  • サーバーの文字エンコーディングが正しく設定されていることを確認してください
    • IF NOT 参照ポイント mysql/pdo
  • ...

  • どこでも utf8/ utf8mb4 を使用していることを確認する必要があります!


mysql:

-mysql_query("SET NAMES 'utf8'");使用するすべてのクエリの前に SET NAMES を実行します。mysql ドライバーが charset のメカニズムを提供していない場合は、SET NAMES を使用する必要があるためです。
-mysql_query("SET CHARACTER SET utf8 ");文字を utf8に設定します
-mysql_set_charset('utf8');文字セットを utf8 に設定します
-mysql API ドライバーは utf8mb4 をサポートしていません (エラー 1115 (42000))
-character_set_server=utf8サーバー文字を設定します

PDO:

- $dbh->exec("set names utf8");PDO を使用している場合は、この行を使用して SET NAMES を実行できます
-$dbh = new PDO("mysql:host=$host;dbname=$db;charset=utf8");この行で文字セットを設定しますが、PHP 5.3.6 以降が必要です
-$dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' ");この行で SET NAMES を設定することもできます
- mb_internal_encoding('UTF-8');PDO を使用するときにエンコーディングを設定します


3. データベースまたはテーブルの文字セットと照合順序を変更する

データベースまたはテーブルの文字セットまたは照合順序を変更する必要がある場合は、次のコード行を使用できます。

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;


4. スクリプト ファイルのエンコーディングを設定する

あなたのskript(php)ファイルが正しい文字セットで保存されていることを確認する必要があるかもしれません!

このために、Notpad++をお勧めします!

ファイルを notpad で開いた場合は、メニューポイントの「エンコード」に移動し、文字セットを変更します


5. php または meta タグを使用してページの文字セットを設定します

データを utf8/utf8mb4 で表示するには、サイトが正しい文字セットで設定されていることを確認する必要があります!

次の 3 つの方法で文字セットを設定できます。

//PHP
ini_set("default_charset", "UTF-8");
header('Content-type: text/html; charset=UTF-8');

//HTML
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

また、フォームで utf8 を受け入れるには、次のようにします。

<form accept-charset="UTF-8">


6. UTF8 と UTF8mb4 の違いは何ですか?

UTF8:
-utf8 は 3 バイトのシンボルのみをサポートします
-...(さらに多く)

UTF8MB4:
-utf8mb3 は 4 バイトのシンボルをサポートします
-...(さらに多く)


7. この特定の質問への回答

私はこれがあなたの使用以来うまくいくはずだと思いますPDO:
(PDOオブジェクトを作成した後!PHPバージョン5.3.6未満を使用している場合)

$dbh->exec("set names utf8");

それ以外の場合は、次のいずれかを試してください。

ini_set("default_charset", "UTF-8");
header('Content-type: text/html; charset=UTF-8');

アップデート:

collationorcharsetdatabaseorを変更するには、tableこれを使用します。

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;


8. 詳細情報/追加リンク


9. 補足事項

9.1 エラー報告
エラーが表示されない場合は、次のコード スニペットを使用します。

<?php
    error_reporting(E_ALL);
    ini_set("display_errors", 1);
?>

9.2 Unicode
間違えないように、本当に utf8 を理解する必要があります!

9.3 mysql、mysqli、および PDO への一言
私の個人的なランキングは次のとおりです。

  1. PDO
  2. みずい
  3. mysql

mysql に対して多くの利点があるため、PDO または mysqli を使用することをお勧めします。

于 2014-11-07T20:42:02.357 に答える
0

テーブルの照合をSQLyogから変更したのですが、壊れているようです。それらをSQLクエリから直接変更すると、うまくいきました。

于 2014-11-07T21:53:04.500 に答える