java - 从java将blob存储到mysql 5.7.16时出现奇怪的异常

标签 java mysql database jdbc blob

我需要帮助解决将文件存储到 mysql 数据库到 blob 字段的无法理解的问题:

我有一个函数

public static void saveFile(File file) {
    try {
        InputStream fi = new FileInputStream(file);
        try {
            try (PreparedStatement st = Database.getPreparedStatement("insert into files (filename, content) values(?,?)")) {
                st.setString(1, file.toString());
                st.setBlob(2, fi);
                st.execute();
            }
        }
        finally {
            fi.close();
        }
    }
    catch (IOException | SQLException e) {
        throw new DatabaseException("Problem in store file to file storage", e);
    }
}

这是关于 hslqdb 和 postgres 数据库的出色工作。 但是当我尝试使用 mysql 5.7 时出现错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '???Ҙ?C%(((?????#??<?
??wx=????R?5?ݞ?n?????o?%<?\0?L?A????Q?Y}d?(???' at line 1

我花了很长时间来理解问题,但在代码中没有看到任何问题。 可能mysql配置不正确。这是我第一次体验mysql中的blob存储。 尽管如此,postgres 和 hsqldb 可以正常工作,没有任何问题。

我暂时重写了这样的函数:

    public static void saveFile(File file) {
    try {
            InputStream fi = new FileInputStream(file);
            byte[] data = new byte[(int) file.length()];
            fi.read(data,0,(int)file.length());
            try {
                try (PreparedStatement st = Database.getPreparedStatement("insert into files (filename, content) values(?,?)")) {
                    st.setString(1, file.toString());
                    st.setBytes(2,data);
                    st.execute();
                }
            }
            finally {
                fi.close();
            }
    }
    catch (IOException | SQLException e) {
        throw new DatabaseException("Problem in store file to file storage", e);
    }
}

它在所有数据库上都能正常工作。但这是不好的方法(我不知道输入文件的大小,但尝试将其加载到内存中)

告诉我出了什么问题?如何使用流来处理 MySQL 中的 blob?

最佳答案

问题已成立。 我不清楚这个错误出现在哪里。 在我们的系统中,作为连接建立过程的一部分被执行

SET @@sql_mode=CONCAT_WS(',', @@sql_mode, 'NO_BACKSLASH_ESCAPES')

这不允许我们传递给 mysql 的字符串中转义反斜杠。

因为只有我删除了这个查询,所以 blob 才开始存储,没有任何问题。

关于java - 从java将blob存储到mysql 5.7.16时出现奇怪的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42329110/

相关文章:

Java ArrayList<T>.转换

MySQL 变量返回错误值

python - 无法在日期时间字段中使用 python 和 mysql 插入无

sql - 在SQL中创建十六进制数

java - FileReader 与 FileInputReader。 split 与模式

java - 使用 Java URL 解析带有 unicode 字符的维基百科 url 时出错

java - 相同的字节码是否意味着源代码相同?

python - mysql 连接器不显示插入的结果

sql - 如何找出返回不同结果的两个查询之间的差异

MySQL(涉及数组)需要表建议