【问题标题】:How do I figure out if a column size is in bytes or characters from the column metadata?如何确定列大小是列元数据中的字节还是字符?
【发布时间】:2009-10-12 19:15:43
【问题描述】:

我正在开发一些必须临时在各种数据库(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 错误,因为试图插入的字符串太大。我错过了什么明显的东西吗?

【问题讨论】:

  • 我猜您在示例中错误地交换了第 2 行和第 3 行?

标签: java sql sql-server oracle db2


【解决方案1】:

我看不出有任何方法可以通过 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,如果是,请针对此视图执行单独查询以检查大小语义。

【讨论】:

  • 所以我想我想做类似的事情,SELECT CHAR_USED FROM ALL_TAB_COLUMNS WHERE TABLE_NAME='' AND COLUMN_NAME='' 看起来至少有 DB2 的等价物。
猜你喜欢
  • 2018-07-23
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 2019-10-08
相关资源
最近更新 更多