java.sql.SQLException:字符串值不正确:'\xF0\x9F\x91\xBD\xF0\x9F…&x27;

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

我有以下字符串值:“walmart obama将行
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&amp;characterEncoding=UTF-8
我认为这支持了@Esailija上面所说的,也就是说,我的MySQL,实际上是5.5,正在找出自己最喜欢的UTF-8编码风格


(注意,我还在java代码中指定我从as
UTF-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