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)的主要内容,如果未能解决你的问题,请参考以下文章