当前位置: 首页 > 面试题库 >

使用Java PreparedStatement无法在MySQL中存储UTF-8内容

和魁
2023-03-14
问题内容

由于某些奇怪的原因,我似乎无法将UTF-8数据添加到我的MySQL数据库中。输入非拉丁字符时,将其存储为?????。其他所有东西都存储良好。因此,例如,“
this is aexample®™”可以很好地存储,而“和英辞典”则存储为“ ????”。

连接网址很好:

private DataSource getDB() throws PropertyVetoException {
    ComboPooledDataSource db = new ComboPooledDataSource();
    db.setDriverClass("com.mysql.jdbc.Driver");
    db.setJdbcUrl("jdbc:mysql://domain.com:3306/db?useUnicode=true&characterEncoding=UTF-8");
    db.setUser("...");
    db.setPassword("...");
    return db;
}

正如您所料,我正在使用PreparedStatement,甚至有人尝试输入“ set names utf8”。

    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    try {
        conn = db.getConnection();

        stmt = conn.prepareStatement("set names utf8");
        stmt.execute();
        stmt = conn.prepareStatement("set character set utf8");
        stmt.execute();

                    ... set title...
        stmt = conn.prepareStatement("INSERT INTO Table (title) VALUES (?)");
        stmt.setString(1,title);

        stmt.execute();
    } catch (final SQLException e) {
    ...

该表本身似乎很好。

Default Character Set: utf8
Default Collation: utf8_general_ci
...
Field title:
Type text
Character Set: utf8
Collation: utf8_unicode_ci

我通过GUI编辑器输入Unicode(特别是“和英辞典”),然后从表中进行选择进行了测试,然后返回了很好的结果。因此,这似乎是JDBC的问题。

我想念什么?


问题答案:

在mysql服务器中有2个要检查的点,以便正确设置UTF-8字符集。

数据库级

这是通过创建它获得的:

CREATE DATABASE 'db' CHARACTER SET 'utf8';

表级

所有表也都必须使用UTF-8(对于您来说似乎是这种情况)

CREATE TABLE  `Table1` (
    [...]
) DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

重要的部分是 DEFAULT CHARSET = utf8 COLLATE = utf8_general_ci

最后,如果您的代码未正确处理utf8,则可以通过在启动时更改设置来强制JVM使用utf8编码:

java -Dfile.encoding=UTF-8 [...]

或更改环境变量

"**JAVA_TOOLS_OPTIONS**" to -Dfile.encoding="UTF-8"

或以编程方式使用:

System.setProperty("file.encoding" , "UTF-8");

(由于JVM在启动时会缓存默认字符编码的值,因此最后一个可能不会产生预期的效果)

希望能有所帮助。



 类似资料:
  • 我正在尝试用utf-8语言保存文本(希伯来语-阿拉伯语-等等)但它失败了。。首先,它给了我(???)所以我把它放在数据源中。groovy dbCreate=“update”url=“jdbc:mysql://localhost/db_name?useUnicode=yes 它给了我一个错误 错误。JDBCException记者-非法混合排序规则(latin1_swedish_ci,IMPLICIT

  • 问题内容: 我有这个表格: 但是当我提交一个é字符时,它将变成é。 为什么不起作用?是的,MySQL数据库已正确设置了所有字符集。(数据库,表。)如果我使用Navicat手动将其放在数据库中,它会在网页上很好地显示。 另外,我尝试了元标记,设置了内容类型标头,但没有成功。 问题答案: 在您的HTML中,添加以下元标记: 还要在脚本顶部添加以下PHP标头: [编辑]: 另一个提示是将文件另存为编码。

  • 问题内容: 我在Java中有以下代码行: 编写者不会编写UTF-8文件,因为当我在notepad ++中打开文件时,它表示编码为:ANSI作为UTF-8。我需要它是纯UTF-8。 你有什么建议吗? 问题答案: notepad ++(和任何其他工具)只能 猜测 编码,它不会写在文件(或某些元数据)的任何位置。 并且,如果您编写的文本不包含ASCII范围之外的任何字符(即,Unicode码点> 127

  • 然后,我就可以查询该表并返回所需字符串。 连接是通过Tomcat的context.xml文件中的资源设置的,配置如下: 正如我所说的,我能够很好地读取字符串/字符,因此我假设表和连接设置都设置正确。 也都返回UTF-8。 感谢任何帮助。谢谢

  • 示例代码(在REPL中): 输出: 问题是:它不是人类可读的。我的(聪明的)用户希望用JSON转储来验证甚至编辑文本文件(我宁愿不使用XML)。 有没有办法将对象序列化为UTF-8 JSON字符串(而不是)?

  • 我试图让两个连字符触发短破折号,三个连字符触发长破折号;喜欢 除了工作。以下是我的收获: 这部作品(11部产生2111部产生3部) 这是同一个脚本,但“1”已被替换为“-”,“2”已被替换为“-”,而“3”已被替换为“-“--”-“应该生成”-“和“--”应该生成”-”,但它不起作用,因为我使用的版本中不完全支持Unicode(AutoHotKey.com上的AutoHotKey_L v1.1.0