ما هو الحد الأقصى لطول عمود Informix وهل يمكن زيادته؟

StackOverflow https://stackoverflow.com/questions/172227

  •  05-07-2019
  •  | 
  •  

سؤال

أحاول إنشاء جدول يتضمن ما يلي:

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 صالحة من الناحية النحوية وإذا قدمت رسالة الخطأ بالضبط.عند إعادة تنسيقها وتصحيح بناء الجملة، تبدو العبارة كما يلي:

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)
);

وعندما يتم تشغيل ذلك على نظام يحتوي على صفحات بحجم 2 كيلو بايت، تكون رسالة الخطأ هي:

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 كيلو بايت.(لو كنت تستخدم نظام AIX، ربما لم تكن لتلاحظ المشكلة.)

كما يجب ألا تقوم بتخزين قيم التاريخ في VARCHAR(255);يجب عليك استخدام DATE أو ربما DATETIME YEAR TO DAY (طريقة غريبة لتهجئة DATE - على الرغم من اختلاف التنسيق الأساسي، باستخدام 5 بايت على القرص بدلاً من 4 لتاريخ عادي)، أو ربما DATETIME YEAR TO SECOND (طريقة مضحكة لـ الطابع الزمني الإملائي)، أو ...الحقول "num0، num1، num2" مشكوك فيها أيضًا؛إذا كان المقصود منها تخزين الأرقام، فاستخدم NUMERIC أو DECIMAL - DECIMAL(20) في معظم قواعد بيانات IDS يعني رقمًا عشريًا مكونًا من 20 رقمًا.

تم التعديل للإضافة:

وللإجابة على السؤال المباشر، يمكن أن يصل طول أعمدة VARCHAR إلى 255 بايت فقط؛يمكن أن يصل حجم أعمدة LVARCHAR إلى حوالي 32 كيلو بايت؛يمكن أن يصل حجم أعمدة CHAR إلى 32 كيلو بايت؛يمكن أن يصل حجم أعمدة TEXT إلى 2 غيغابايت، ويمكن أن يصل حجم أعمدة CLOB إلى حجم أكبر.يقتصر الطول الإجمالي للصف على حوالي 32 كيلو بايت (ولكن يتم احتساب أعمدة BYTE وTEXT وBLOB وCLOB كموصف ثابت الحجم لإجمالي 32 كيلو بايت - يتم تخزين البيانات الفعلية خارج الصف).هناك بعض تبعيات الإصدار التي لم أذكرها - إذا كنت تستخدم IDS 10.00 أو إصدار أحدث، فهذا دقيق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top