如何确定列大小是以字节为单位还是以列元数据中的字符为单位?

4 java sql sql-server oracle db2

我正在开发一些软件,它必须临时在各种数据库(Oracle、DB2、SQLServer)中创建虚拟条目。该行中的每一列都填充有随机数据。

该代码使用 java 中的 java.sql.DataBaseMetaData 类来获取 COLUMN_SIZE 属性,以计算出要在 VARCHAR2 和其他字符串列类型中存储的随机字符串的大小。

DatabaseMetaData metadata = connection.getMetaData();
while (resultSet.next()) {
  ResultSet resultSet = metadata.getColumns(...);
  int size = resultSet.getInt("COLUMN_SIZE");
}
Run Code Online (Sandbox Code Playgroud)

问题是,至少在 Oracle 中,我似乎无法弄清楚列长度是以字节还是字符形式返回的。此外,根据编码的不同,字符的字节数也不同。将所有这些结合起来,我收到一些 SQL 错误,因为尝试插入的字符串太大。我错过了一些明显的东西吗?

Dav*_*sta 5

我没有看到任何方法可以通过 JDBC 元数据来确定这一点。还有另一列称为 CHAR_OCTET_LENGTH 但在我的实验中它无助于区分字节和字符语义。

在 Oracle 数据字典中找到这一点的方法是查看 ALL_TAB_COLUMNS.CHAR_USED:

    CHAR_USED   VARCHAR2(1)     
        B | C.
        B indicates that the column uses BYTE length semantics.
        C indicates that the column uses CHAR length semantics.
        NULL indicates the datatype is not any of the following:

        * CHAR
        * VARCHAR2
        * NCHAR
        * NVARCHAR2
Run Code Online (Sandbox Code Playgroud)

因此,您可以检查是否已连接到 Oracle,如果已连接,则针对此视图执行单独的查询以检查大小语义。