【问题标题】:What is the max length of an Informix column and can it be increased?Informix 列的最大长度是多少,可以增加吗?
【发布时间】:2008-10-05 16:30:11
【问题描述】:

我正在尝试使用以下内容创建表:

CREATE TABLE GTW_WORKFLOW_MON 
(
    WORKFLOW_NAME VARCHAR(255) NOT NULL, 
    WORKFLOW_LOADED NUMERIC(20) NOT NULL, 
    ACTIVITY_NAME VARCHAR(255) NOT NULL,
    FLAGS INTEGER NOT NULL,
    MONITOR_NAME VARCHAR(255) NOT NULL,
    CLASSNAME VARCHAR(255) NOT NULL,
    STR0 VARCHAR(255),
    STR1 VARCHAR(255),
    STR2 VARCHAR(255), 
    NUM0 VARCHAR(255), 
    NUM1 VARCHAR(255), 
    NUM2 VARCHAR(255), 
    DATE0 VARCHAR(255),
    DATE1 VARCHAR(255), 
    DATE2 VARCHAR(255), 
    PRIMARY KEY (WORKFLOW_NAME, WORKFLOW_LOADED, ACTIVITY_NAME, MONITOR_NAME)
)

由于列长度不够大而失败。

【问题讨论】:

    标签: sql database informix


    【解决方案1】:

    如果 SQL 语句在语法上有效并且您提供了准确的错误消息,这将有所帮助。重新格式化并更正语法后,语句如下所示:

    CREATE TABLE gtw_workflow_mon
    (
        workflow_name   VARCHAR(255) NOT NULL,
        workflow_loaded NUMERIC(20) NOT NULL,
        activity_name   VARCHAR(255) NOT NULL,
        flags           INTEGER NOT NULL,
        monitor_name    VARCHAR(255) NOT NULL,
        classname       VARCHAR(255) NOT NULL,
        str0            VARCHAR(255),
        str1            VARCHAR(255),
        str2            VARCHAR(255),
        num0            VARCHAR(255),
        num1            VARCHAR(255),
        num2            VARCHAR(255),
        date0           VARCHAR(255),
        date1           VARCHAR(255),
        date2           VARCHAR(255),
        PRIMARY KEY(workflow_name, workflow_loaded, activity_name, monitor_name)
    );
    

    并且,当它在具有 2KB 页面的系统上运行时,错误消息是:

    SQL -550: Total length of columns in constraint is too long.
    

    获取错误消息简要说明的标准方法是finderr;它说:

    $ finderr -550
    -550    Total length of columns in constraint is too long.
    
    The total size of all the columns listed in a UNIQUE, PRIMARY KEY, or
    FOREIGN KEY clause is limited. The limit depends on the database server
    in use, but all servers support a total of 120 bytes. The limit is the
    same as the restriction on the total size of all columns in a composite
    index. For additional information, see the CREATE TABLE statement in
    the IBM Informix Guide to SQL: Syntax.
    
    $
    

    “总共120个字节”应该是“总共至少120个字节”;该下限适用于 Informix SE。在 IDS (Informix Dynamic Server) 中,下限为 255 字节,但在最近的系统中更大,并且在页面大小更大时也更大。

    您有多种选择。

    • 您可以考虑一下为什么每个名称都需要 255 个字符 - 这是否合理(例如,64 个就足够了)?
    • 如果您的服务器版本足够新(我相信是 10.00 或更高版本),您可以在具有更大页面大小的 dbspace 中创建表。

    由于密钥最大为 3*255+(20/2+1) = 776 字节,经验法则是您需要能够存储 5 个最大长度的密钥值 + ROWID/FRAGID 开销 ( 8 字节)每页,您需要 4 KB 的页面大小。 (如果您一直在 AIX 上运行,您可能不会注意到这个问题。)

    此外,您不应将日期值存储在 VARCHAR(255) 中;你应该使用 DATE 或者 DATETIME YEAR TO DAY (一种奇怪的 DATE 拼写方式 - 尽管底层格式不同,在磁盘上使用 5 个字节而不是 4 个字节来表示普通 DATE),或者可能是 DATETIME YEAR TO SECOND(一种有趣的方式拼写 TIMESTAMP),或者... 'num0, num1, num2' 字段也很可疑;如果它们用于存储数字,请使用 NUMERIC 或 DECIMAL -- DECIMAL(20) 在大多数 IDS 数据库中表示 20 位浮点十进制数。

    编辑添加:

    而且,要回答直接问题,VARCHAR 列最多只能有 255 个字节长; LVARCHAR 列最多可达 32 KB; CHAR 列最大为 32 KB; TEXT 列可以达到 2 GB,CLOB 列可以更大。一行的总长度被限制在大约 32 KB(但 BYTE、TEXT、BLOB 和 CLOB 列算作一个固定大小的描述符,总长度为 32 KB - 实际数据存储在行之外)。有一些版本依赖我没有提出 - 如果您使用的是 IDS 10.00 或更高版本,这是准确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 2011-06-01
      • 2018-01-10
      • 2012-10-25
      相关资源
      最近更新 更多