Java 检查字符串是否与mySQL的UTF-8兼容

Java 检查字符串是否与mySQL的UTF-8兼容,java,mysql,string,utf-8,character-encoding,Java,Mysql,String,Utf 8,Character Encoding,我们有旧的mySQL数据库,只支持UTF-8字符集。Java中是否有方法检测给定字符串是否与UTF-8兼容?每个字符串都与UTF-8兼容。只要在数据库和MySQL驱动程序中正确设置编码,就可以了 唯一的问题是UTF-8编码字符串的字节长度可能大于.length()所说的长度 编辑:由于Saqib指出旧版MySQL实际上不支持UTF-8,而只支持其BMP子集,因此可以使用string.length()==string.codePointCount(0,string.length())(“true”

我们有旧的mySQL数据库,只支持UTF-8字符集。Java中是否有方法检测给定字符串是否与UTF-8兼容?

每个字符串都与UTF-8兼容。只要在数据库和MySQL驱动程序中正确设置编码,就可以了

唯一的问题是UTF-8编码字符串的字节长度可能大于
.length()
所说的长度

编辑:由于Saqib指出旧版MySQL实际上不支持UTF-8,而只支持其BMP子集,因此可以使用
string.length()==string.codePointCount(0,string.length())
(“true”表示“所有代码点都在BMP中”)检查字符串是否包含BMP之外的代码点,并使用
string.replaceAll([^\u0000-\uffff]”删除它们,“”)

公共静态布尔值isUTF8MB4(字符串s){
对于(int i=0;i3){
返回true;
}
}
返回false;
}
上面的实现似乎是最好的,但除此之外:

public static boolean isUTF8MB4(String s) {
    for (int i = 0; i < s.length(); ) {
        int codePoint = s.codePointAt(i);
        int bytes = Character.charCount(codePoint);
        if (bytes > 3) {
            return true;
        }
        i += bytes;
    }
    return false;
}
公共静态布尔值isUTF8MB4(字符串s){
对于(int i=0;i3){
返回true;
}
i+=字节;
}
返回false;
}
这可能更容易失败。

MySQL:

名为utf8的字符集每个字符最多使用三个字节,并且仅包含BMP字符

因此,该功能应在以下情况下发挥作用:

private boolean isValidUTF8(final String string) {
    for (int i = 0; i < string.length(); i++) {
        final char c = string.charAt(i);
        if (!Character.isBmpCodePoint(c)) {
            return false;
        }
    }
    return true;
 }
专用布尔值isValidUTF8(最终字符串){
对于(int i=0;i
没有“Mysql utf-8”这样的东西。utf-8本身就是一个标准。要么是支持utf-8/unicode,要么不是。@MarcB.谢谢。我更新了问题。不仅数据库端和java端应该支持utf-8(两者都是),但对于MySQL,还必须设置通过JDBC驱动程序的通信,请参阅@JoopEggen。谢谢。我们检查了JDBC驱动程序,并且设置正确。当我们遇到旧版本MySQL无法处理的UTF8MB4字符串时,会出现问题。我不认为这是正确的。您不能将UTF8MB4字符串存储在只支持U的旧MySQL DBs中TF8.
每个字符串都与UTF-8兼容
谢谢Joop。但是我们已经有了检测UTF8MB4的代码:。我们要寻找的是一个字符串是否与UTF8兼容的提示。Java字符串是Unicode的,没有UTF-8问题。我觉得旧的MySQL可以处理UTF-8,只要它编码了Unicode码点(字符)不超过3个字节。上面说以U+10000(java 0x10000)开头的代码点有问题。你好,Joop。听起来我们需要重新表述这个问题……我们想说的是,我们的旧mySQL数据库不支持所有字符集(例如:UTF8MB4,但也支持其他字符集)因此,在java中——在我们尝试插入一个字符串(这将导致mySQL引发异常)之前——我们想确定该字符串是否与UTF8兼容。如果不兼容,那么在进行插入之前,我们会处理该情况。那么,我们如何确定该字符串是否与UTF8兼容?那么“UTF8”呢“在此上下文中是旧MySQL UTF-8实现的名称。它是最新的标准UTF-8减去UTF8MB4特定部分(多字节序列,每个Unicode字符超过3个字节)。
private boolean isValidUTF8(final String string) {
    for (int i = 0; i < string.length(); i++) {
        final char c = string.charAt(i);
        if (!Character.isBmpCodePoint(c)) {
            return false;
        }
    }
    return true;
 }