sql >> データベース >  >> RDS >> Mysql

MySQLに非ラテン記号を挿入できません

    UTF-8では、Упячка 実際には\x423\x43F\x44F\x447\x43A\x430として表す必要があります 。 \xD0\xA3\xD0\xBF\xD1\x8F... ISO-8859-1を使用して正しくエンコードされていないことを意味します。

    これを証明するテストスニペットは次のとおりです。

    String s = new String("Упячка".getBytes("UTF-8"), "ISO-8859-1"); // First decode with UTF-8, then (incorrectly) encode with ISO-8859-1.
    for (char c : s.toCharArray()) {
        System.out.printf("\\x%X", (int) c);
    }
    

    どの印刷物

    \xD0\xA3\xD0\xBF\xD1\x8F\xD1\x87\xD0\xBA\xD0\xB0
    

    したがって、問題は1ステップ前に解決する必要があります。 Java Webアプリケーションについて話しているのですが、この文字列はユーザ​​ー入力の結果である可能性が高いので、HTTP要求と応答のエンコーディングに注意を払っていますか?まず、JSPでは、JSPの先頭に以下を追加する必要があります。

    <%@ page pageEncoding="UTF-8" %>
    

    これにより、ページがUTF-8でレンダリングされるだけでなく、HTTP Content-Type ページがUTF-8を使用してレンダリングされることをクライアントに指示する応答ヘッダー。これにより、クライアントは、コンテンツを表示し、同じエンコーディングを使用してフォームを処理する必要があることを認識します。

    ここで、HTTPリクエストの部分です。GETリクエストの場合は、問題のservletcontainerを設定する必要があります。たとえばTomcatでは、これはURIEncodingを設定する問題です。 HTTPコネクタ の属性 /conf/server.xmlにあります によると。 POSTリクエストの場合、これは、JSPで指定されている応答エンコーディングを使用するのに十分なスマートさを備えたクライアント(Webブラウザ)によってすでに処理されている必要があります。そうでない場合は、Filterを導入する必要があります チェック> およびセット リクエストのエンコーディング。

    背景情報の詳細については、この記事を参照してください。 便利です。

    これとは別に、MySQLにはUnicode文字に関する別の問題があります。 UTF-8文字のみをサポートします最大3バイト 、4バイトではありません。つまり、65535文字のBMP範囲のみがサポートされ、外部ではサポートされません。たとえばPostgreSQLはそれを完全にサポートしています。これはWebアプリケーションに悪影響を与えないかもしれませんが、これは確かに覚えておくべきことです。



    1. MySQLのロケールの完全なリスト

    2. PHPでSQLクエリを実行するにはどうすればよいですか?

    3. SQLServerのすべてのサーバートリガーのリストを返す

    4. 2つのテーブルすべてを結合しますが、列の数が異なります