java.sql.SQLException:字符串值不正确:'\xF3\xBE\x8D\x81';

java.sql.SQLException:字符串值不正确:'\xF3\xBE\x8D\x81';,java,mysql,utf-8,Java,Mysql,Utf 8,我在试图保存一些tweet时遇到以下异常 原因:java.sql.SQLException:第1行“twtText”列的字符串值“\xF3\xBE\x8D\x81”不正确 位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055) 位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 在com.mysql.jdbc.MysqlIO.checkErrorP

我在试图保存一些tweet时遇到以下异常

原因:java.sql.SQLException:第1行“twtText”列的字符串值“\xF3\xBE\x8D\x81”不正确 位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055) 位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 在com.mysql.jdbc.MysqlIO.checkErrorPacket上(MysqlIO.java:3491) 在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)上 位于com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936) 位于com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) 位于com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542) 位于com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734) 位于com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2019) 位于com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937) 位于com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922) 在org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94) 位于org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)

我的表格结构如下所示,所有列均为UTF-8格式

 CREATE TABLE `tblkeywordtracking` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `word` varchar(200) NOT NULL,
  `tweetId` bigint(100) NOT NULL,
  `twtText` varchar(800) DEFAULT NULL,
  `negTwtText` varchar(1000) DEFAULT NULL,
  `language` text,
  `links` text,
  `negWt` double DEFAULT NULL,
  `posWt` double DEFAULT NULL,
  `tweetType` varchar(20) DEFAULT NULL,
  `source` text,
  `sourceStripped` text,
  `isTruncated` varchar(40) CHARACTER SET latin1 DEFAULT NULL,
  `inReplyToStatusId` bigint(30) DEFAULT NULL,
  `inReplyToUserId` int(11) DEFAULT NULL,
  `isFavorited` varchar(40) CHARACTER SET latin1 DEFAULT NULL,
  `inReplyToScreenName` varchar(40) DEFAULT NULL,
  `latitude` bigint(100) NOT NULL,
  `longitude` bigint(100) NOT NULL,
  `retweetedStatus` varchar(40) CHARACTER SET latin1 DEFAULT NULL,
  `statusInReplyToStatusId` bigint(100) NOT NULL,
  `statusInReplyToUserId` bigint(100) NOT NULL,
  `statusFavorited` varchar(40) CHARACTER SET latin1 DEFAULT NULL,
  `statusInReplyToScreenName` text,
  `screenName` text,
  `profilePicUrl` text,
  `twitterId` bigint(100) NOT NULL,
  `name` text,
  `location` text,
  `bio` text,
  `utcOffset` int(11) DEFAULT NULL,
  `timeZone` varchar(100) DEFAULT NULL,
  `frenCnt` bigint(20) DEFAULT '0',
  `createdAt` datetime DEFAULT NULL,
  `createdOnGMT` text CHARACTER SET latin1,
  `createdOnServerTime` datetime DEFAULT NULL,
  `follCnt` bigint(20) DEFAULT '0',
  `favCnt` bigint(20) DEFAULT '0',
  `totStatusCnt` bigint(20) DEFAULT NULL,
  `usrCrtDate` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `id` (`id`,`word`),
  KEY `twtText` (`twtText`(333)),
  KEY `word` (`word`,`tweetType`),
  KEY `posWt` (`posWt`,`negWt`)
) ENGINE=MyISAM AUTO_INCREMENT=1740 DEFAULT CHARSET=utf8;

必须向列
twtText
添加字符集和排序规则。因此,您的专栏应该如下所示:

twtText varchar(800) character set utf8 collate utf8_polish_ci DEFAULT NULL,
使用所需的排序规则更改
utf8\u polish\u ci

运行以下查询以查看可用的排序规则:

SHOW COLLATION;

它看起来像一个有效的utf-8序列,对以下字符进行编码


如您所见,这是一个使用超过2个字节的Unicode字符。从中,我推断MySQL仍然不支持这个Unicode字符子集(至少对于<5.5版本是这样)。

MySQL 5.0/5.1不支持4字节UTF8字符,这是一个已知的限制。 MySQL 5.5支持4字节UTF8字符


请参见

您必须提供场景中使用的MySQL服务器和MySQL连接器版本的相关信息。3字节UTF8序列==2字节Unicode字符。这是一个4字节的UTF8序列,它编码20位Unicode字符。你是对的,我错过了UTF8编码的额外位。0xF3BE8D81是11110 011 10 11111 0 10 001101 10 000001,它是Unicode 01111 0001011000001=0xFE341。如果您使用的是MySQL>=5.5,最好是
utf8mb4
<代码>utf8仅存储1-3字节的utf8字符。