فصل پنجم :
SQLite Data Type
Data Type یا دیتا تایپ و یا نوع داده ، ویژگیست که نوع دیتای هر آبجکت را مشخص میکند (عدی ، رشته و...)
هر ستون (column)، متغیر(variable) و Expression دارای دیتا تایپی می باشد. که مشخص میکند نوع ان چیست آیا یک رشه از کاراکتر هاست ، همانند نام و نام خانوادگی و یا یک عدد است مثل سن یک فرد.
در هنگام ساختن یک جدول و وقتی که ستونهای ان را مشخص میکینم بایستی دیتا تایپ هر ستون را نیز مشخص کنیم.
نکته مهم این است که دیتاتایپ یک مقدار از روی خود آن مقدار تعیین میشود و نه دیتاتایپ ستون ان. (با اس کیو ال سرور مایکروسافت متفاوت است) . این امکان جالب باعث میشود کارهایی را با SQLite بتوانید انجام دهید که با موتور های پایگاه داده ایی مثل اس کیوال سرور مایکوسافت که در ان دیتاتایپ یک ستون را مشخص میکینم و نوع داده داخل ان ستون در رکورد های جدول باید دقیقا معادل دیتاتایپ تعریف شده ستون باشد ، نمی تواند انجام داد.
هر مقداری که در یک دیتابیس SQLite ذخیره میشود یکی از StorageClass های ذیل را دارد :
Storage Class
|
Description
|
NULL
|
The value is a NULL value.
|
INTEGER
|
The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.
|
REAL
|
The value is a floating point value, stored as an 8-byte IEEE floating point number.
|
TEXT
|
The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16LE)
|
BLOB
|
The value is a blob of data, stored exactly as it was input.
|
در واقع Storage Class ها کلی تر از دیتا تایپ ها می باشند. مثلا در Storage Class ی به نام INTEGER ، 6 نوع دیتا تایپ گوناگون با طول های مختلف وجود دارد که در فایل دیتابیس بروی دیسک متفاوت می باشند اما به محض اینکه مثلا یک مقدار INTEGER از روی دیسک خوانده شد و به حافظه کامپیوتر شما منتقل شد به دیتاتایپ های اصلی INTEGER تبدیل میشوند . (ما با Integer StorageClass کار میکینم ولی خود SQLite در هنگام ذخیره این مقدار با بروی دیسک با توجه به به طول ان مقدار آنرا در دیسک ذخیره میکند.بنابراین فضای اشغال شده از دیسک برای یک عدد 2 رقمی با یک عدد 6 رقمی متفاوت خواهد بود درصورتی که هر دو اینها را بعنوان Integer می شناسیم.)
Type Affinity
در موتور های پایگاه داده ایی همانند اس کیوال سرور مایکروسافت که برخلاف SQLite در آنها باید به صراحت دیتاتایپ یک ستون از جدول را مشخص کرد معمولا تلاش میشود تا در هنگام درج یک رکورد و یا بروز رسانی آن ، مقادیر ورودی را به دیتاتایپ های صحیح متناسب با دیتا تایپ آن ستون تبدیل کنند . مثلا کد زیر را در یک پنجره کوئری در محیط
sql server management studioاجرا کنید :
CREATE TABLE t1(a INT, b VARCHAR(10));
INSERT INTO t1(a,b) VALUES('123',456);
خط اول واضح است یک جدول در دیتابیس جاری ما می سازد که ستون اول ان از دیتاتایپ int می باشد و دومی یک رشته کاراکتری بطور نهایی 10 . حال خط دوم . می بینید که اس کیوال سرور رشته ‘123’ را به عدد 123 تبدیل کرده و نیز عدد 456 را نیز به رشته ‘456’ تبدیل کرده البته قبل از عمل درج (Insert) ، و کد بالا بدون خطا در اس کیوال سرور مایکروسافت اجرا خواهد شد. و در نتیجه در ستون اول در جدول عدد 123 و در دستون دوم رشته ‘456’ را خواهیم داشت. برای ایجاد نهایت سازگاری SQLite با سایر موتور های پایگاه داده ، SQLite در ستون ها از مفهومی پشتیبانی میکند بنام :
"Type affinity" .
یک ستون در واقع نوع داده ارجح را برای مقادیر ذخیره شده در یک ستون مشخص میکند. نکته مهم این است که نوع داده ارجح را مشخص میکنیم و این الزامی نیست .هر ستون هنوز هم می تواند هر نوع داده را در خود جا دهد ولیکن برای SQLite مشخص میکنیم که ترجیحا از فلان Storage Class برای این ستون استفاده کند. این Storage Class ترجیح داده شده را Affinity می نامیم .
The preferred storage class for a column is called its "affinity".
ما می تونیم برای هر ستون از یک جدول در SQLite یکی از Type Affinity های ذیل را مشخص کنیم .
• TEXT
• NUMERIC
• INTEGER
• REAL
• BLOB
ستونی با TEXT affinity تمامی Storage Class های NULL,TeXT و BLOB را در خود ذخیره میکند. اگر ما یک عدد را بخواهیم در این ستون درج کنیم قبل از درج در جدول این عدد به یک شته تبدیل شده و پس از ان عمل درج انجام می شود.
ستونی با NUMBERIC affinity می تواند حاوی هر 5 نوع Storage Class باشد . حال هنگامی که یک رشته را می خواهیم در یک ستون NUMERIC ذخیره کنیم . Storage class یک متن به INTEGER و یا REAL تبدیل می شود ، اگر این تبدیل برگشت پذیر و بدون از دست رفتن دیتا باشد. اگر SQLite ببینید که این تبدیل برگشت پذیر نیست و یا باعث از دست رفتن دیتا میشود آن مقدار با Storage Class TEXT ذخیره میکند.
Affinity یه یک ستون از روی دیتاتایپ آن تشخیص داده میشود
1. اگر نام دیتاتایپ شامل کلمه "INT" باشد مثل INT,INTEGER,SMALLINT و BIGINT ، دراین هنگام INTEGER affinity به آن اختصاص داده می شود.
2. اگر نام دیتاتایپ شامل کلماتی نظیر : "CHAR", "CLOB" یا "TEXT" باشد آنگاه TEXT affinity به آن اختصاص داده میشود.
3. اگر نام دیتاتایپ شامل کلمه : "BLOB" باشد ویا اگر اصلا دیتا تایپی مشخص نشده باشد آنگاه BLOB affinity به آن اختصاص داده میشود.
4. اگر نام دیتاتایپ شامل کلماتی نظیر : "FLOA", "REAL" یا "DOUB" باشد آنگاه REAL affinity به آن اختصاص داده میشود.
5. در غیر اینصورت affinity اختتصاص داده شده NUMBERIC خواهد بود.
نکته مهم این است که ترتیب لیست بالا برای اختصاص affinity بسیار مهم است مثلا اگر دیتاتایپ یک ستون "CHARINT" باشد . پس قانون 1 و 2 برای آن صدق میکنند با توجه به ترتیب قوانین و اینکه INTEGER مقدم است بر TEXT پس affinity اختصاص داده شده در نهایت INTEGER خواهد بود .
به جدول ذیل دقت کنید :
نام دیتاتایپ ها در دستور ساخت جدول و یا عبارت CAST
|
Affinity نتیجه
|
قانونی که برای تشخیص affinity استفاده شده
|
INT
INTEGER
TINYINT
SMALLINT
MEDIUMINT
BIGINT
UNSIGNED BIG INT
INT2
INT8
|
INTEGER
|
1
|
CHARACTER(20)
VARCHAR(255)
VARYING CHARACTER(255)
NCHAR(55)
NATIVE CHARACTER(70)
NVARCHAR(100)
TEXT
CLOB
|
TEXT
|
2
|
BLOB
no datatype specified
|
BLOB
|
3
|
REAL
DOUBLE
DOUBLE PRECISION
FLOAT
|
REAL
|
4
|
NUMERIC
DECIMAL(10,5)
BOOLEAN
DATE
DATETIME
|
NUMERIC
|
5
|
Boolean
SQLite دارای Storage Class ی برای نوع داده Boolean نیست بنابراین این نوع داده بعنوان integer و 0 برای مقدار (false) و 1 برای مقدار (true) استفاده میشود.
Date and Time
SQLite دارای Storage Class خاصی برای این نوع داده نیست بنابراین آنها را بعنوان TEXT و یا REAL و یا INTEGER ذخیره میکند .
Storage Class
|
Date Format
|
TEXT
|
A date in a format like "YYYY-MM-DD HH:MM:SS.SSS".
|
REAL
|
The number of days since noon in Greenwich on November 24, 4714 B.C.
|
INTEGER
|
The number of seconds since 1970-01-01 00:00:00 UTC.
|
مفاهیم و موضوعات این فصل عبارتند از :