【问题标题】:java.sql.SQLException: Incorrect string value MySQL with JDBCjava.sql.SQLException:使用 JDBC 的 MySQL 字符串值不正确
【发布时间】:2015-06-01 08:14:54
【问题描述】:

我的项目使用 MySQL db。我想用 jdbc 保存数据。但是某些字符有问题。例如 ğ,ş。我的连接 url 如下。

jdbc:mysql://localhost:3306/kutuphane useUnicode=true&characterEncoding=UTF-8

但我收到 java.sql.SQLException: Incorrect string value: '\xC4\x9F\xC4\x9F\xC4\x9F' 错误。我已尝试此站点中的所有方法,但无法解决问题.即使它保存了,此时记录的字符失败。不显示 ğ,ş 等。是不是 mysql 的错误?

【问题讨论】:

  • 问题很可能出在表的字符集中。尝试在 MySQL CLI 中执行插入操作,看看会出现什么错误。
  • 我试过了,没有报错。正在保存中。
  • SQLException 是否来自 INSERT? (在 utf8 编码中,十六进制 C49F 是 ğ "latin small letter g with breve" - 一个土耳其字符)
  • 是的,它来自插入
  • “是否是 mysql 错误?” - 不,这不是错误。您只是试图将 UTF-8 字符插入到无法接受它们的列中。正如@RickJames 建议的那样,请edit 您的问题向我们展示 SHOW CREATE TABLE 的结果。

标签: mysql jdbc utf-8


【解决方案1】:

MySQL 默认支持 utf8,其中字符由 3 个字符表示。对于 4 字节字符,您需要改用 utf8mb4。

【讨论】:

    【解决方案2】:

    不正确的字符串值:'\xC4\x9F\xC4\x9F\xC4\x9F'

    您正在尝试将 UTF-8 字符插入到无法接受它们的列中。您必须确保 的 COLLATION(字符集)与 UTF-8 兼容。

    该列设置可能已被显式设置,或者它可能只是使用了表的默认设置(可能使用也可能没有使用数据库的默认值,而数据库可能使用也可能没有使用默认值)服务器的值)。

    SHOW CREATE TABLE tablename 会告诉你当前的设置是什么。如果你看到类似的东西

    CREATE TABLE `utf8test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `textcol` varchar(50) COLLATE latin1_general_cs DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs
    

    那么您将无法在textcol 中插入任意 UTF-8 字符,除非您执行类似的操作

    ALTER TABLE utf8test 
        CHANGE COLUMN textcol textcol VARCHAR(50) COLLATE utf8_general_ci
    

    【讨论】:

    • 无论如何我的表是 UTF-8。虽然它是 UTF-8 我不能插入它
    猜你喜欢
    • 2011-09-13
    • 2011-03-23
    • 2013-02-10
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多