8

私のデータベースでは、エラーが発生します

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column

私は Java と MySQL 5 を使用しています。4 バイト Unicode は Java では合法ですが、MySQL 5 では違法であることを知っているので、問題を引き起こす可能性があると思います。データのタイプを確認したいので、ここに質問があります。 UTF-8 データが 3 バイトまたは 4 バイトの Unicode であることを確認しますか?

4

3 に答える 3

17

UTF-8は、基本多言語面(つまり、U+0000からU+FFFFまで)のすべてを1〜3バイトでエンコードします。したがって、文字列内のすべてがBMPにあるかどうかを確認する必要があります。

charJavaでは、 Javaはサロゲートペアを使用して非BMP文字をエンコードするため、(UTF-16コードユニットである)いずれかが高サロゲート文字か低サロゲート文字かを確認することを意味します。

public static boolean isEntirelyInBasicMultilingualPlane(String text) {
    for (int i = 0; i < text.length(); i++) {
        if (Character.isSurrogate(text.charAt(i))) {
            return false;
        }
    }
    return true;
}
于 2013-02-20T13:37:08.870 に答える
10

BMP を超えてサポートしたくない場合は、MySQL に渡す前にそれらの文字を取り除くことができます。

public static String withNonBmpStripped( String input ) {
    if( input == null ) throw new IllegalArgumentException("input");
    return input.replaceAll("[^\\u0000-\\uFFFF]", "");
}

BMP を超えてサポートしたい場合は、MySQL 5.5+ が必要であり、(照合、文字セットなど) すべてを変更する必要がありutf8 ますutf8mb4。しかし、私がよく知らないドライバーでもこれをサポートする必要があります。Java でこれらの文字を処理するのも面倒です。これらの文字は 2 にまたがっておりchars 、多くの操作で特別な処理が必要になるからです。

于 2013-02-20T15:29:16.250 に答える
6

私が見つけたJavaで非BMP文字を削除する最良の方法は次のとおりです。

inputString.replaceAll("[^\\u0000-\\uFFFF]", "\uFFFD");
于 2013-11-18T04:39:02.467 に答える