如果我通过传递blob使用resultset.getString()会发生什么?

时间:2015-05-14 07:32:27

标签: java mysql

我的表中有一个使用MySQL的blob列。我试图通过ResultSet的getString方法获取此值,rs.getString("xxxxxx")我不确定在某些情况下是否会出现问题。剂量取决于我在本专栏中存储的内容?

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

存储在数据库中的内容并不重要。它不是String或int并不重要。您从查询结果中获取数据,并将其解释为String。 字符串不是某些字节序列。它是对期望为String的Object的引用。这意味着内存中某些结构的参考点主要是其他参考文献的结构。因此,当你采用一些字节序列并假设这是对Object的引用时,很可能会有运行时异常。可能是ClassCastException,但谁知道你的数据有什么。因此,即使例外情况在这种情况下也是不可预测的。

底线 - 不要这样做。

答案 1 :(得分:-1)

没有限制,您可以使用rs.getString("xxxxxx"),根据getString的实现,您将获得一个包含blob数据的字符串,其格式为byte } array

    if ((localObject1 instanceof OracleSerialBlob)) {
        localObject2 = (OracleSerialBlob) localObject1;
        return new String(((OracleSerialBlob) localObject2).getBytes(0L, (int) ((OracleSerialBlob) localObject2).length()));
    }

如上所述,如果条件调用低于String构造函数:

public String(byte bytes[]) {
    this(bytes, 0, bytes.length);
}

以下是getString("xxxx");

的实施
public String getString(int paramInt) throws SQLException {
    Object localObject1 = getObject(paramInt);

    if (localObject1 == null) {
        return (String) localObject1;
    }
    if ((localObject1 instanceof String)) {
        return (String) localObject1;
    }
    if (((localObject1 instanceof Number)) || ((localObject1 instanceof BigDecimal))) {
        return localObject1.toString();
    }
    if ((localObject1 instanceof java.sql.Date)) {
        return ((java.sql.Date) localObject1).toString();
    }
    if ((localObject1 instanceof Timestamp)) {
        return ((java.sql.Date) localObject1).toString();
    }
    if ((localObject1 instanceof byte[]))
        return new String((byte[]) localObject1);
    Object localObject2;
    if ((localObject1 instanceof OracleSerialClob)) {
        localObject2 = (OracleSerialClob) localObject1;
        return ((OracleSerialClob) localObject2).getSubString(0L, (int) ((OracleSerialClob) localObject2).length());
    }

    if ((localObject1 instanceof OracleSerialBlob)) {
        localObject2 = (OracleSerialBlob) localObject1;
        return new String(((OracleSerialBlob) localObject2).getBytes(0L, (int) ((OracleSerialBlob) localObject2).length()));
    }

    if ((localObject1 instanceof URL)) {
        return ((URL) localObject1).toString();
    }
    if ((localObject1 instanceof Reader)) {
        try {
            localObject2 = (Reader) localObject1;
            char[] arrayOfChar = new char[1024];
            int i = 0;
            StringBuffer localStringBuffer = new StringBuffer(1024);
            while ((i = ((Reader) localObject2).read(arrayOfChar)) > 0)
                localStringBuffer.append(arrayOfChar, 0, i);

            return localStringBuffer.substring(0, localStringBuffer.length());
        } catch (IOException localIOException) {
            throw new SQLException("Error during conversion: " + localIOException.getMessage());
        }
    }

    throw new SQLException("Fail to convert to internal representation");
}

Reference