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

ehxuflar  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(254)

我正在开发一些软件,需要在各种数据库(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");
}

问题是,至少在Oracle中,我似乎无法判断返回的列长度是以字节还是字符表示。另外,根据编码的不同,字符是不同的字节数。合并所有这些,我会得到一些SQL错误,因为试图插入的字符串太大。我是否遗漏了一些明显的信息?

t0ybt7op

t0ybt7op1#

我看不出有任何方法可以通过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

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

ztigrdn8

ztigrdn82#

CHAR_OCTET_LENGTH对我有效。在Oracle 11g、ojdbc11上测试:21.6.0.0.1
CHAR_OCTET_LENGTH返回列可以容纳的字节数。这是您需要确定数据是否适合该列的值。
如何计算列的定义:

  • 如果CHAR_OCTET_LENGTH == COLUMN_SIZE,则将列定义为Varchar2(COLUMN_SIZE)。
  • 如果CHAR_OCTET_LENGTH〉COLUMN_SIZE,则将列定义为Varchar2(COLUMN_SIZE CHAR)
  • 唯一的例外是长度为4000:CHAR_OCTET_LENGTH的硬限制为4000,因此无法区分varchar2(4000)和varchar2(4000 CHAR)。

相关问题