سؤال

عند إنشاء عمود رقم من النوع في Oracle، لديك خيار عدم تحديد الدقة أو مقياس. ماذا تفعل هذه الافتراضي إذا كنت لا تحددها؟

هل كانت مفيدة؟

المحلول

رقم (الدقة، مقياس)

إذا لم يتم تحديد الدقة، فإن العمود يخزن القيم كما هو الحال. إذا لم يتم تحديد مقياس، فإن الحجم صفر.

الكثير معلومات أكثر في:

http://download.oracle.com/docs/cd/b28359_01/server.111/b28318/datatype.htm#cncpt1832.

نصائح أخرى

ال NUMBER يمكن تحديد نوع في أنماط مختلفة:

 الناتجة الناتجة الناتجة الدقة المواصفات الدقة مقياس الشيك تعليق ------------------------------------------ ------------------------------------- رقم null null no 'أقصى مدى و الاحكام'، يتم تخزين القيم 'كما معطى'رقم (P، S) رمز الخطأ نعم: رقم ORA-01438 (P) P 0 YES رمز الخطأ: ORA-01438 رقم (*، S) 38 S

حيث الدقة هو إجمالي عدد الأرقام والمقياس هو عدد الأرقام الصحيحة أو اليسار (الحجم السلبي) من النقطة العشرية.

تقوم أوراكل بتحديد ORA-01438

القيمة أكبر من الدقة المحددة المسموح بها لهذا العمود

كما لوحظ في الجدول، فإن فحص النزاهة هذا نشط فقط إذا تم تحديد الدقة بشكل صريح. وإلا تقريب Oracle بصمت القيمة المدرجة أو المحدثة باستخدام بعض الأسلوب غير المحدد.

أعتقد أن الدقة الافتراضية هي 38، مقياس الافتراضي هو صفر. لكن الحجم الفعلي لمثيل هذا العمود، ديناميكي. سيستغرق الأمر مساحة أقل حسب الحاجة لتخزين القيمة أو ماكس 21 بايت.

Oracle أرقام المتاجر بالطريقة التالية: 1 byte على السلطة، 1 byte لأول رقم هارماني (أي واحد قبل الفاصل)، والباقي للأرقام الأخرى.

بواسطة digits هنا Oracle يعني centesimal digits (بمعنى آخر base 100)

SQL> INSERT INTO t_numtest VALUES (LPAD('9', 125, '9'))
  2  /

1 row inserted

SQL> INSERT INTO t_numtest VALUES (LPAD('7', 125, '7'))
  2  /

1 row inserted

SQL> INSERT INTO t_numtest VALUES (LPAD('9', 126, '9'))
  2  /

INSERT INTO t_numtest VALUES (LPAD('9', 126, '9'))

ORA-01426: numeric overflow

SQL> SELECT DUMP(num) FROM t_numtest;

DUMP(NUM)
--------------------------------------------------------------------------------
Typ=2 Len=2: 255,11
Typ=2 Len=21: 255,8,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79

كما نرى، الرقم الأقصى هنا هو 7.(7) * 10^124, ، ولديه 19 الأرقام المائة للدقة، أو 38 أرقام عشرية.

في الواقع، يمكنك دائما اختبارها بنفسك.

CREATE TABLE CUSTOMERS ( CUSTOMER_ID NUMBER NOT NULL, JOIN_DATE DATE NOT NULL, CUSTOMER_STATUS VARCHAR2(8) NOT NULL, CUSTOMER_NAME VARCHAR2(20) NOT NULL, CREDITRATING VARCHAR2(10) ) ;

select column_name, data_type, nullable, data_length, data_precision, data_scale from user_tab_columns where table_name ='CUSTOMERS';

أتوسع في إجابة الأطياف حتى لا يتعين على الناس تجربتها لأنفسهم.

تم ذلك على إصدار قاعدة بيانات Oracle 11G Express Edition 11.2.0.2.0 - الإنتاج.

CREATE TABLE CUSTOMERS
(
  CUSTOMER_ID NUMBER NOT NULL,
  FOO FLOAT NOT NULL,
  JOIN_DATE DATE NOT NULL,
  CUSTOMER_STATUS VARCHAR2(8) NOT NULL,
  CUSTOMER_NAME VARCHAR2(20) NOT NULL,
  CREDITRATING VARCHAR2(10)
);

select column_name, data_type, nullable, data_length, data_precision, data_scale
from user_tab_columns where table_name ='CUSTOMERS'; 

الذي يحصد

COLUMN_NAME      DATA_TYPE  NULLABLE DATA_LENGTH DATA_PRECISION DATA_SCALE
CUSTOMER_ID      NUMBER     N        22        
FOO              FLOAT      N        22          126    
JOIN_DATE        DATE       N        7        
CUSTOMER_STATUS  VARCHAR2   N        8        
CUSTOMER_NAME    VARCHAR2   N        20        
CREDITRATING     VARCHAR2   Y        10    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top