Java.sql.SQLException: Неверное строковое значение: '\ xF3\xBE\x8D\x81'
Я получаю следующее исключение, пытаясь сохранить некоторые твиты,
Вызвано: java.sql.SQLException: неправильное строковое значение: '\ xF3\xBE\x8D\x81' для столбца 'twtText' в строке 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2019) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922) at org.hibernate.id.IdentityGenerator $GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94) at 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;
Ответы
Ответ 1
Вы должны добавить набор символов и сопоставление в столбец twtText
. Поэтому ваша колонка должна выглядеть так:
twtText varchar(800) character set utf8 collate utf8_polish_ci DEFAULT NULL,
Измените utf8_polish_ci
на то, что вам нужно.
Запустите следующий запрос, чтобы просмотреть доступные сопоставления:
SHOW COLLATION;
Ответ 2
MySQL 5.0/5.1 не поддерживает 4-байтные символы UTF8, это известное ограничение.
MySQL 5.5 поддерживает 4-байтные символы UTF8.
См. 9.1.10. Поддержка Unicode
Ответ 3
Он выглядит как действительная последовательность utf-8, которая кодирует следующий символ U + FE341.
Как вы можете видеть, это символ Юникода, который использует более 2 байтов. Из this и this Я выхожу, что MySQL все еще не работает 't поддерживает это подмножество символов Unicode (по крайней мере для версий < 5.5).