java.sql.SQLException:字符串值不正确:'\xF0\x9F\x91\xBD\xF0\x9F…&x27;
我有以下字符串值:“walmart obama将行java.sql.SQLException:字符串值不正确:'\xF0\x9F\x91\xBD\xF0\x9F…&x27;,java,mysql,encoding,character-encoding,sqlexception,Java,Mysql,Encoding,Character Encoding,Sqlexception,我有以下字符串值:“walmart obama将行useUnicode=true&;characterEncoding=UTF-8附加到您的jdbc url 在您的情况下,数据不是使用UTF-8编码发送的。我猜MySQL不相信这是有效的UTF8文本。我尝试在具有相同列定义的测试表上插入(MySQL客户端连接也是UTF8)虽然它进行了插入,但我使用MySQL CLI客户端以及JDBC检索的数据没有正确检索到值。为了确保UTF8工作正常,我为obama插入了一个“ö”而不是“o”: johan
useUnicode=true&;characterEncoding=UTF-8
附加到您的jdbc url
在您的情况下,数据不是使用UTF-8编码发送的。我猜MySQL不相信这是有效的UTF8文本。我尝试在具有相同列定义的测试表上插入(MySQL客户端连接也是UTF8)虽然它进行了插入,但我使用MySQL CLI客户端以及JDBC检索的数据没有正确检索到值。为了确保UTF8工作正常,我为obama插入了一个“ö”而不是“o”:
johan@maiden:~$ mysql -vvv test < insert.sql
--------------
insert into utf8_test values(_utf8 "walmart öbama What you have is EXTRATERRESTRIAL ALIEN (U+1F47D)
and BROKEN HEART (U+1F494)
which
are not in the basic multilingual plane. They cannot be even represented in java as one char, "Weirdly, I found that REMOVING &characterEncoding=UTF-8
from the JDBC url
did the trick for me with similar issues.
Based on my properties,
jdbc_url=jdbc:mysql://localhost:3306/dbName?useUnicode=true
johan@maiden:~$mysql-vvv测试 它们不在基本的多语言平面中。它们甚至不能在java中表示为一个字符,“奇怪的是,我发现从JDBC url
中删除&characterEncoding=UTF-8
对我来说也有类似的问题
根据我的财产
?useUnicode=true&characterEncoding=UTF-8
我认为这支持了@Esailija上面所说的,也就是说,我的MySQL,实际上是5.5,正在找出自己最喜欢的UTF-8编码风格
(注意,我还在java代码中指定我从asUTF-8
读取的InputStream
,这可能没有什么坏处)我是如何解决问题的
我有
在我的hibernate jdbc连接url中,我将数据库中的字符串数据类型更改为longtext,以前是varchar。我遇到了类似的问题,在仔细检查所有字符集并发现它们都是正确的之后,我意识到类中有缺陷的属性被注释为@Column而不是@JoinColumn(javax.presistence;hibernate)并且它正在打破一切。我面临同样的问题,并通过为每列设置排序规则到utf8\u general\u ci来解决它。总之,要保存需要4个字节的符号,您需要更新utf8mb4
的字符集和排序规则:
数据库表/列:
alter table转换为字符集utf8mb4校对utf8mb4\u unicode\u ci
数据库服务器连接()
在我的#2开发环境中,我更喜欢在启动服务器时在命令行上设置参数:
mysqld--character set server=utf8mb4--collation server=utf8mb4\u unicode\u ci
顺便说一句,请注意使用设置名称“utf8mb4”
:
不要使用Connector/J发出查询集名称,因为驱动程序不会检测到字符集已更改,并将继续使用在初始连接设置期间检测到的字符集
并避免在连接url中设置characterEncoding
参数,因为它将覆盖已配置的服务器编码:
要覆盖客户端上自动检测到的编码,请在用于连接到服务器的URL中使用characterEncoding属性
执行
vim /etc/my.cnf
如果不是utf8mb4,则查找字符集服务器
把它放在你的my.cnf里,就像
character_set_server = utf8mb4
加一行
最后重新启动mysql此外,数据类型可以使用varchar或text的blob安装。此设置useOldUTF8Behavior=true对我来说效果很好。它没有给出错误的字符串错误,但它将像Ã这样的特殊字符转换为多个字符并保存在数据库中
为了避免这种情况,我从JDBC参数中删除了这个属性,而是将我的列的数据类型转换为BLOB。这非常好。如何将它附加到我的连接字符串中?如果有帮助,我将使用Netbeans。您如何创建连接?DriverManager.getConnection(“JDBC:mysql://localhost:####/[dbName]“,[用户名],[密码];按如下方式操作-DriverManager.getConnection(“jdbc:mysql://localhost:####/[dbName]?useUnicode=true&;characterEncoding=UTF-8“,[user name],[password]);请注意,我忘记了“?”,但现在我又回到了与原始帖子相同的错误…顺便说一句,您的字符串中的字符在OSX上的Firefox和Chrome中都没有正确显示。它们确实在我的iTerm应用程序中正确显示。我认为这取决于字体。请查看我的其他相关帖子:。如果您能回答,那么您会的我也回答了这个问题。另一篇文章提供了我所做工作的更多细节。@codekingplus您是否已将数据库中的所有内容都更改为utf8mb4
,看起来您仍在使用utf8\u general\u ci
。请勿使用“设置名称”"使用Connector/J:不要使用Connector/J发出查询集名称,因为驱动程序不会检测到字符集已更改,并将继续使用在初始连接设置期间检测到的字符集。
如果您只想从BMP外部删除字符,而不是处理混乱的字符集更改数据库,请参见此处:我有相同的问题,按照上述步骤操作,但直到在C:\ProgramData\MySQL\MySQL server 5.7\my.ini中更改了字符集服务器=utf8mb4后才得到解决。可能根本不需要useUnicode=true
?在我的情况下,唯一有效的方法是全局设置character\u set\u server=utf8mb4
在服务器上(RDS参数组)在JDBC URL中没有任何字符编码。这看起来像是创建数据库时的一个副本,您可以这样给出字符集和排序:create database db\u name字符集utf8mb4 COLLATE utf8mb4\u unicode\u ci;
Greate,如果您不需要索引该列并且该列相对较小,但我可以为r我所有的专栏都认为你能在你的答案中添加更多细节吗?(代码、命令等)character\u set\u server
是选项,而不是character set server
你不想要的
character_set_server = utf8mb4