SQL查询结果导出Excel时CLOB字段显示[C@25c4828b异常求助
解决SQL导出Excel时CLOB字段显示为
[C@xxxxxx的问题 嘿,这个问题我见过好多开发者碰到过!当你把带CLOB类型字段的SQL查询结果导出到Excel时,出现[C@25c4828b这种格式,本质上是因为默认的导出逻辑没正确读取CLOB的实际文本内容,而是直接输出了CLOB对象(或者它内部的字符数组)的对象引用标识——[C代表字符数组,后面的一串是对象的哈希码。下面给你两种靠谱的解决办法:
方案1:在SQL查询里直接转换CLOB为字符串
如果你的数据库支持,直接在查询语句中把CLOB字段转成普通字符串,这样导出的时候拿到的就是现成的文本内容,不用再改代码。不同数据库的转换方式略有不同:
- Oracle:用
DBMS_LOB.SUBSTR()函数,比如把content_clob字段转成字符串:
要是CLOB内容超长(超过4000字符,Oracle默认varchar2的长度限制),可以指定截取长度,比如SELECT id, DBMS_LOB.SUBSTR(content_clob) AS content FROM your_table;DBMS_LOB.SUBSTR(content_clob, 8000),或者根据需求分段处理。 - MySQL:用
CAST()或CONVERT()函数:SELECT id, CAST(content_clob AS CHAR) AS content FROM your_table; - SQL Server:转换成
VARCHAR(MAX)类型:SELECT id, CAST(content_clob AS VARCHAR(MAX)) AS content FROM your_table;
方案2:在导出代码中手动处理CLOB对象
如果不方便修改SQL语句,那就在代码读取ResultSet的时候,手动解析CLOB对象的内容。以Java JDBC为例,不要直接用getString()读取CLOB字段(部分驱动可能不支持),而是用getClob()获取对象后再读取内容:
// 假设你从ResultSet中获取数据 Clob clobField = resultSet.getClob("content_clob"); // 读取CLOB的全部内容,转为字符串 String clobContent = clobField != null ? clobField.getSubString(1, (int) clobField.length()) : ""; // 把clobContent写入Excel对应的单元格即可
这样就能拿到CLOB的实际文本内容,而不是输出对象标识了。
额外提醒
- 要是CLOB内容特别大(超过Excel单个单元格的字符上限32767),导出时可能需要做截断或者拆分单元格的处理,避免内容丢失。
- 不同数据库驱动对CLOB的支持有差异,如果上面的方法不好用,可以检查下驱动版本是否为最新,或者查阅对应驱动的官方文档调整处理逻辑。
内容的提问来源于stack exchange,提问作者Jun Luo




