mysql用“?”替换外来字符(Java)

Posted

技术标签:

【中文标题】mysql用“?”替换外来字符(Java)【英文标题】:mysql replaces foreign characters with "?"s (Java) 【发布时间】:2016-11-03 23:45:37 【问题描述】:

我的项目旨在获取 URL,获取所述 URL 的创建日期,并从 URL 中提取特定信息。当且仅当它们是英语和西班牙语时,所有这些参数才能成功传递给 mysql;但是,每当我遇到外国摘录,例如:

بسم الله الرحمن الرحيم نسألكم الدعاء

mysql 将其翻译为:

??? ??? ??? ??? ??? ???

我了解这是一个 UTF-8 问题。在 intellij 上,当我打印该行时,我可以很好地看到外来字符,所以我假设 JSoup 检索到的任何内容都很好。

以下是 Java 代码。如果它很重要,我将使用 c3p0 连接到数据库。我相信建立与数据库的连接不是问题,但为了需要它,我可以提供它。

import org.jsoup.Jsoup;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.sql.PreparedStatement;
import org.jsoup.nodes.Document;
import java.beans.PropertyVetoException;
import com.mchange.v2.c3p0.*;


public class Connect 

private static final String URL = "jdbc:mysql://localhost:3306/testdb?allowMultiQueries=true";
private static final String USER = "root";
private static final String PASSWORD = "1234";

//Connection information here

public static void addlink(String url, String body, String createDate, String retrieveDate)  // adds html information to the database
    Connection connection = null;
    PreparedStatement statement = null;
    try 
        connection = cpds.getConnection();
        statement = connection.prepareStatement("INSERT IGNORE INTO testtable(URL, Creation_Date, Retrieval_Date, Body) VALUES(?, ?, ?, ?);");
        statement.setString(1, url);
        statement.setString(2, createDate);
        statement.setString(3, retrieveDate);
        statement.setString(4, body);
        statement.executeUpdate();
     catch // error handling



public void getPageData(String url, String retrieveDate) throws IOException  // gets the html information
    Document doc = Jsoup.connect(url).userAgent("Mozilla").get();
    String str = doc.body().text();
    int endOfBody = str.length(); //for cutting out needless info in html text
    StringBuilder body = new StringBuilder(str);
    body.replace(0, 25, ""); // cut out unnecessary header info
    body.replace(endOfBody - 128, endOfBody, ""); // cut out unnecessary trailer info
    String finalBody = body.toString();
    String createDate = finalBody.substring(finalBody.length()-10, finalBody.length());
    addlink(url, finalBody, createDate, retrieveDate);
    

就我对数据库所做的更改而言,Url 的主体作为 MEDIUMTEXT 传递,我做到了:

mysql> ALTER TABLE testtable
-> DEFAULT CHARACTER SET utf8
-> collate utf8_general_ci
-> ;

提前感谢大家可以分享的任何见解。

编辑:这已被标记为重复,但有问题的论坛帖子只是将 mysql 转换为 unicode 的一步。

【问题讨论】:

尝试将连接字符串编辑成类似jdbc:mysql://server/database?characterEncoding=UTF-8 我怀疑这是 intellij 的问题;您可能需要考虑删除标签。 Java PreparedStatement UTF-8 character problem的可能重复 @Enwired 我添加了它,得到了相同的结果,一行 ?s。会不会是 Jsoup? 【参考方案1】:

事实证明,UTF-8 需要在 Java 代码中大量指定才能正常工作。这是大纲:

1) 将以下内容附加到您用于连接 mysql 的 URL 中(归功于 @Enwired):

useUnicode=yes&characterEncoding=UTF-8"

所以你得到:

URL = "jdbc:mysql://localhost:3306/testdb?useUnicode=yes&characterEncoding=UTF-8";

2) 在添加条目时,在代码中添加以下内容:

java.sql.Statement unicode = null;
try 
        // note, how you connect does not matter
        connection = cpds.getConnection(); 
        unicode = connection.createStatement();
        unicode.executeQuery("SET NAMES 'UTF8';");
        unicode.executeQuery("SET CHARACTER SET 'UTF8';");
        // Other prepared statements. 
     catch (SQLException e) 
       // ...

3) 进入 mysql 并更改将接收 utf8 字符的数据库、表和列的排序规则。 How to change the default collation of a database?

您的 mysql 服务器现在应该接受 unicode。

【讨论】:

以上是关于mysql用“?”替换外来字符(Java)的主要内容,如果未能解决你的问题,请参考以下文章

使用 UTF-8 编码,具有特殊属性/外来字符的 CSV 文件在导入 MySQL (phpMyAdmin) 时不保留

Java怎么使用replace替换字符串中的某一位的字符

js中怎么用replace替换字符串中的问号

mysql中replace替换字符串更改方法

MySQL可以替换多个字符吗?

Java:用其他不同的字符替换一组字符