0

我已将 MariaDB 设置为默认字符集 UTF-8。根据Blue Box Blog Character Set Hell的说法,该设置将使我摆脱无法识别的重音字符(如“é”)的问题。

但是,我无法得到一些结果

SELECT title FROM tablename WHERE title = 'sometext'

其中sometext不需要有重音字符。

是否有处理 utf8 字符集的独特方法?因为它看起来无法识别 java 中的字符串。

在 Java 代码中

String query = "SELECT title FROM tablename WHERE title=?";

PreparedStatement pState = conn.getPreparedStatement(query);
ResultSet result;
String textResult = null;

pState.setString(1, "sométéxt");
result = pState.executeQuery();

if(result.next())
  textResult= result.getString(1);

System.out.println(textResult);

输出:

null

其他方法

1)

String query = "SELECT title FROM tablename WHERE CONVERT(title USING utf8)=?";

2)

String query = "SELECT title FROM tablename WHERE title=?";

byte[] req = "sométéxt".getBytes("UTF-8");
pState.setBytes(1,req);

输出

null

Char Set=utf8 之前面临的问题

在 Character Set=utf8 之前,我对数据库的第一次设置是使用默认字符集 latin1_swedish_ci。使用我的字段 'tablename' datatype= VARBINARY (),可以解决无法识别的重音

SELECT * FROM tablename WHERE CONVERT(title USING utf8) = 'sometext'

但是,因为我的数据库有超过 1000 万行。在整个 'title' 字段上使用CONVERT函数会使 SQL 查询和 Java 程序运行非常缓慢。

4

2 回答 2

2

您选择的字符集决定了您的文本信息的存储方式。但是,您选择的排序规则决定了您的 WHERE 子句如何匹配该信息。

尝试

  SELECT title FROM tablename WHERE title=? COLLATE utf8_general_ci

如果可行——如果你开始得到你想要的行——改变你的表名表中的标题列,如下所示

   ALTER TABLE tablename1 
   CHANGE title title VARCHAR(xxxx) CHARACTER SET utf8 COLLATE utf8_general_ci NULL 

您实际上应该使用标题列的现有定义,然后将其放入COLLATE utf8_general_ci子句中。进行此更改后,您可能需要重建索引。但无论如何,您的匹配将开始正常工作

如果您正在使用一种特定的语言,您可能希望采用它自己的排序规则。例如,在一般排序规则中,N 和 Ñ 被视为同一个字母,但在西班牙语中它们不是。

于 2013-06-21T03:17:24.370 回答
0

如果其他所有内容都设置为 utf-8(将 100% 工作),请尝试在写入 db 时使用它:

public String to_utf8(String fieldvalue) throws UnsupportedEncodingException{

        String fieldvalue_utf8 = new String(fieldvalue.getBytes("ISO-8859-1"), "UTF-8");
        return fieldvalue_utf8;
}
于 2015-04-06T13:26:04.497 回答