web-dev-qa-db-ja.com

ラテン語のアクセント付き文字(ã、õ、á、é、í、…)をPHP / MySQLのデータベーステーブルに送信する際の問題

Mydatabaseテーブルにラテン語の文字を表示させるのに問題があります。 (ã、õ、á、é、í、…)。 Apache2.4.9とMySQL5.6.17でWAMPサーバーを使用しています。

HTMLで作成した単純なフォームがあり、PHPコードウィッチがクエリを実行してアカウントを作成します。PHPコード:

include('config.php'); //My database data for connection

if(isset($_POST['submit'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $email = $_POST['email'];

    $query = "INSERT INTO account SET username = '".$username."', password = PASSWORD('".$password."'), email = '".$email."'";
    $execute_query = mysqli_query($connection, $query);
    if($execute_query) { 
        //Creates the account
    }
    else { 
        //If an error occures
    }
}

たとえば、次のアカウントを作成します。

Username: Luís
Password: 1234
E-mail: [email protected]

表を確認すると、作成されたアカウントが表示されますが、ユーザー名にはLuísではなくLuÃsと表示されます。

私が試したこと:

Creating a DataBase and Table with:
utf8_general_ci
utf8_unicode_ci
utf8mb4_general_ci
utf8mb4_unicode_ci
latin1_swedish_ci

それらのどれも機能しませんでした、それは常にíの代わりにÃを示します。

3
João Luís

クエリ「SETNAMESutf8」の問題を修正しました。

include('config.php'); //My Database data for connection.
//Connection set with $connection = mysqli_connect($mysql_Host, $mysql_user, $mysql_pass, $mysql_db)

if(isset($_POST['submit'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $email = $_POST['email'];

    $connection->query("SET NAMES utf8"); //FIXED (Gets $connection from config.php and runs the query "SET NAMES utf8")
    $query = "INSERT INTO account SET username = '".$username."', password = PASSWORD('".$password."'), email = '".$email."'";
    $execute_query = mysqli_query($connection, $query);
    if($execute_query) { 
        //Creates the account
    }
    else { 
        //If an error occures
    }
}

@JakeGouldが私を助けてくれてありがとう、結局私はデータベーステーブルに問題がなかった。私のデータベースとテーブルは、CHARSET = utf8とCOLLATE = utf8_unicode_ciで設定されました。

2
João Luís

問題の根本を診断します。

Mydatabaseテーブルにラテン語の文字を表示させるのに問題があります。 (ã、õ、á、é、í、…)

これには、HTMLフォームデータ、PHPファイル、およびMySQLの間のエンコーディングの不一致の兆候がすべてあります。問題はHTMLフォームとPHPファイルはUTF8データを送信しています(UTF8は現在のデフォルトのエンコード方法であるため)。MySQLデータベースは(デフォルトで)latin1_swedish_ciエンコードを使用するように設定されています。

つまり、これは、理論的にHTMLとPHPファイルをlatin1_swedish_ciに変更できる、「6つのうち6つ、もう1つは6つ」」の問題の1つです。今日のインターネットの世界とWeb開発の世界ではかなり退行的です。

したがって、データチェーン全体 —HTMLフォームからPHP、MySQLデータベースまで)がすべてUTF8であることを確認することをお勧めします。UTF8ですべてを取得したら、人生はたくさんの理由でとても楽です。

この問題が発生する理由は、(デフォルトで)ほとんどのMySQLインストールが新しく作成されたデータベースに対してlatin1_swedish_ciではなくutf8_general_ciを設定するためです。ですから、あなたはそれを修正しようとして正しい方向に進んでいます。

ただし、MySQLデータベース(および与格サーバー)を文字エンコード(この場合はUTF8エンコード)を適切に処理するように設定するには、複数のことを行う必要があります。

問題を解決するために実行できる手順。

まず、データベースの照合順序を変更して、再試行してください。

ALTER DATABASE [name of your database] CHARACTER SET utf8;

これが特定のテーブルである場合、照合順序は次のように変更できます。

ALTER TABLE [name of your table] CONVERT TO CHARACTER SET utf8;

そして、それがテーブルの特定の列である場合:

ALTER TABLE [name of your table] MODIFY [name of your column] [other settings] CHARACTER SET utf8 COLLATE utf8_general_ci;

または、現在のデータベースをエクスポートし、このコマンドを使用して新しいデータベースを作成し、データを再インポートすることもできます。

CREATE DATABASE [name of your database] CHARACTER SET utf8 COLLATE utf8_general_ci;

また、問題が発生したマシンへのMySQLインストールに永続的な変更を加えたい場合は、my.cnfに移動して編集してください。以下は、チェーン全体をUTF-8に設定します。

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
0
JakeGould