Java store以统一编码将页面爬网到mysql

Java store以统一编码将页面爬网到mysql,java,mysql,encoding,web-crawler,Java,Mysql,Encoding,Web Crawler,我正在使用Java将网页爬行到MySQL数据库 这些网页采用各种编码(例如GBK、UTF8…),可能不包含ASCII字符,但是,我设法检测到每个网页的编码并获得可读字符串(可读字符串意味着它在Eclipse控制台中的显示与在Web浏览器中的显示相同) 我从标签获取网页编码,如果未找到,则默认为UTF-8。 请参见以下代码段: InputStream is = hconn.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOut

我正在使用Java将网页爬行到MySQL数据库

这些网页采用各种编码(例如GBK、UTF8…),可能不包含ASCII字符,但是,我设法检测到每个网页的编码并获得可读字符串(可读字符串意味着它在Eclipse控制台中的显示与在Web浏览器中的显示相同)

我从
标签获取网页编码,如果未找到,则默认为
UTF-8
。 请参见以下代码段:

InputStream is = hconn.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b = -1;
while (-1 != (b = is.read())) {
    baos.write((byte) b);
}

String charset = "UTF-8";
Document doc = Jsoup.parse(baos.toString());
Elements metas = doc.select("meta[http-equiv=Content-Type]");

Pattern p = Pattern.compile("charset=([0-9a-zA-Z_\\-]+)");
Matcher m;

for (Element meta : metas) {
    m = p.matcher(meta.toString());
    if (m.find())
        charset = m.group(1);
}

String str = new String(baos.toByteArray(), charset);
然后,我将其存储到MySQL。MySQL连接url是
jdbc:mysql://localhost:3306/db?characterEncoding=gbk
,存储文本的列采用
GBK
编码

发生的事情是,
Eclipse控制台中良好显示的字符串在MySQL中被证明是不可识别的序列,有时可能引发SQLException。从观察上看,没有任何
GBK
字符串会出错

我认为将
Non-GBK
字符串转换为
GBK
会起作用,但是如何转换呢? 有什么变通方法吗?我的最终目标是构造一个反向索引

最好回答编码转换问题

任何帮助都将不胜感激。提前谢谢


添加:

创建表SQL:

CREATE TABLE `indexer`.`pages` (
  `content` TEXT CHARACTER SET gbk COLLATE gbk_chinese_ci,
  `url` VARCHAR(512) NOT NULL,
  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
)
ENGINE = InnoDB;
错误消息:


您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解使用“é”?μ附近的正确语法¢Wé?μ?é?μ-é?DPIyé?0“)Sé”?Java将在内部正确表示Eclipse控制台显示的字符串。您应该能够使用UTF8连接到数据库,并将数据存储在UTF8编码的列中。如果希望列为GBK,我仍然会使用UTF8进行连接。如果这不起作用,如果您可以发布
createtable
语句和之前收到的错误消息,这将非常有用

使用UTF8连接只会帮助那些使用UTF8编码的页面,而不支持其他编码。我发布了
createtable
SQL和错误消息。无论如何谢谢。@user435657,这似乎很奇怪。您是否尝试过将列和编码都设置为UTF8?