JavaSciptを使用してPHPスクリプト経由でAJAX POSTを介して)スクリプトにデータを送信するページで作業しています。問題は、入力が次の言語の場合、ラテン語ベースではないので、MySQLテーブルに意味不明な文字を格納することになり、ラテン語のアルファベットはうまく機能します。
ページ自体はUTF-8文字をレンダリングできます。ページの読み込み時に提供されたデータ内にある場合は、私が苦労している投稿です。
اختبار
保存します。ブラウザの開発ツールのネットワークPOSTリクエストを参照してください。
投稿は次のJS関数を介して行われます
function createEmptyStack(stackTitle) {
return $.ajax({
type:'POST',
url:'ajax.php',
data: {
"do": 'createEmptyStack',
newTitle: stackTitle
},
dataType: "json"
});
}
これが私のPHPコードです。
header('Content-Type: text/html; charset=utf-8');
$newTitle = trim($_POST['newTitle']);
$db->query("
INSERT INTO t1(project_id, label)
VALUES (".$_SESSION['project_id'].", '".$newTitle."')");
このようにページのエンコーディングをチェックすると:
mb_detect_encoding($_POST['newTitle'], "auto");
結果が得られます:TF-8
次のヘッダーも試しました:
header("Content-type: application/json; charset=utf-8");
データが送信されるはずのMySQLテーブル照合はtf8_general_ciに設定されています
ユーザーが同じテーブルにデータを入力するフォームを持つ別のページがあり、どの言語でも完全に機能します。同様のデータをdbに正常に挿入できる理由を他のページで確認すると、上記の挿入クエリが次のように表示されます。
mysql_query("SET NAMES utf8");
クエリの上に、データがまだ意味不明に見える同じ行を追加しようとしました。次の代替案も試しました。
mysql_query("SET CHARACTER SET utf8 ");
そして
mysql_set_charset('utf8', $db);
...しかし、役に立たない。私は踏みにじられました。それを理解するのに助けが必要です。
環境:
PHP 5.6.40(cgi-fcgi)
MySQL 5.6.45
[〜#〜]更新[〜#〜]
さらにテストを実行しました。
私はアラビア語で「これはテストです」という語句を使用しました-هذااختبار
Ajax.phpコードは正しく動作しているようです。 db挿入後、次のようなUTF-8エンコード値が返されます: "\ u0647\u0630\u0627\u0627\u062e\u062a\u0628\u0627\u0631"、エンコーディングは: "UTF-8"に設定されていますが、私のdbテーブルに挿入されたデータは次のように表示されます:هذااختبار
それでは、なぜdbテーブルを別の照合順序に変換しないのですか?いくつかの理由:.5 milのレコードがあり、非常によく似たINSERTを実行する別のページに移動すると、実際に正しく動作します。
私の他のページがデータの挿入時にASCIIエンコーディングを使用していることがわかります。したがって、ASCII ajax.phpに変換しようとするのは自然なことです。問題I空白のデータで終わります私は今とても混乱しています...
ありがとう
修正済みいくつかの手がかりに基づいて、このページのすべての関数をPDOに書き直して、うまくいきました!
1年ほど前にMySQL 5.7を実行していたシステムで非常によく似た問題に遭遇しました。 utf8mb4に設定する必要があるときに、データベース設定の一部がutf8に設定されているように思えます。これにより、データベースはマルチバイト文字を適切に処理できます。
注:utf8mb4エンコーディングはバージョン5.5のMySQLに追加されました。
次のクエリを使用して、エンコーディングを変更できます。データベース、テーブル、列の名前、および列のデータ型を状況に合わせて変更してください。
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name DATATYPE CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
これは私があなたのコードを機能させるために使用したものです:
<?php
$db = mysqli_connect("localhost", "root", "", "demo");
$db->set_charset("utf8");
// Check connection
if ($db === false) {
die("ERROR: Could not connect. " . mysqli_connect_error());
}
$newTitle = trim($_POST['newTitle']);
$db->query("
INSERT INTO t1(project_id, label)
VALUES ('5', '" . $newTitle . "')");
このタグをHTMLヘッドに追加します。
<meta charset="utf-8">
私はlatin1_bin
とutf8_bin
でテストしましたが、どちらの場合でも機能しました。
PHPバージョン7.3.9
MySQLi 5.0.12-dev