Java 编码字节数组时无法识别重音字母

Java 编码字节数组时无法识别重音字母,java,mysql,arrays,string,utf-8,Java,Mysql,Arrays,String,Utf 8,我正在为我的大学开发一个项目。我在尝试将字节数组转换为字符串时遇到问题 首先,我将java文件的内容保存在MySql中的一个长blob类型列中,如下所示: Path path = Paths.get(file.getAbsolutePath()); Charset charset = StandardCharsets.UTF_8; String fileContent = new String(Files.readAllBytes(path), charset); ... String quer

我正在为我的大学开发一个项目。我在尝试将字节数组转换为字符串时遇到问题

首先,我将java文件的内容保存在MySql中的一个长blob类型列中,如下所示:

Path path = Paths.get(file.getAbsolutePath());
Charset charset = StandardCharsets.UTF_8;
String fileContent = new String(Files.readAllBytes(path), charset);
...
String query = "INSERT INTO MY_TABLE(FILE_CONTENT) VALUES (?)";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setString(1, fileContent);
preparedStmt.executeUpdate();
String query = "SELECT * FROM MY_TABLE";
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(query);
while (rs.next())
{
  Blob file= rs.getBlob("FILE_CONTENT");
  String fileContent= new String(file.getBytes(1l, (int) file.length()), StandardCharsets.UTF_8);
该文件包含一些带有西班牙语口音的单词,这些单词已正确插入数据库(如图所示):

稍后,在我的应用程序中,我需要阅读本专栏的信息。我喜欢这样:

Path path = Paths.get(file.getAbsolutePath());
Charset charset = StandardCharsets.UTF_8;
String fileContent = new String(Files.readAllBytes(path), charset);
...
String query = "INSERT INTO MY_TABLE(FILE_CONTENT) VALUES (?)";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setString(1, fileContent);
preparedStmt.executeUpdate();
String query = "SELECT * FROM MY_TABLE";
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(query);
while (rs.next())
{
  Blob file= rs.getBlob("FILE_CONTENT");
  String fileContent= new String(file.getBytes(1l, (int) file.length()), StandardCharsets.UTF_8);
打印文件内容时,无法识别字符é。我得到一个类似这样的文本:
driver.findElement(By.id(“FNAME”)).sendKeys(“Leonardo Pa�z”)

我已经尝试了这些帖子中的建议 (), (), () 还有一些类似的博客,但我还没有找到解决这个问题的方法


非常感谢您的帮助:)

您说文件内容是一个blob,但您使用setString()设置它的数据。从javadocs:

注:用于设置的setter方法(setShort、setString等) IN参数值必须指定与兼容的类型 已定义输入参数的SQL类型。例如,如果 参数具有SQL类型整数,则应使用方法setInt

由于您的类型是blob,因此必须使用setBlob:

try (InputStream fileContent = Files.newInputStream(path))
{
    preparedStmt.setBlob(1, fileContent);
}
另一种方法是将SQL类型更改为文本类型之一,例如LONGTEXT(如果您需要大文件)。BLOB对于文本来说没有多大意义。然后可以简单地使用setString()和getString():

您还需要将数据库/表/列编码更改为UTF-8

再进一步解释一下:


使用setString()向数据库提供字符串时,Java和数据库都不知道原始文件的编码。数据库使用默认编码(可能是ISO_8859_1)存储字符。由于ISO_8859_1具有字符é,因此可以在MySQL工作台中很好地看到它。然后,当您使用getBlob()获取数据并使用UTF-8对其进行解码时,由于文本未存储为UTF-8,因此字符会丢失。

您能否提供
的十六进制字符
。如果那是
E9
,那么你有拉丁语1;如果是
C3A9
,则表示utf8的格式正确。