📚 فصل ۱۰: انواع دادهها (Data Types) در SQL Server
1️⃣ مقدمه — Data Type چیست و چرا مهم است؟
در SQL Server، نوع داده (Data Type) مشخص میکند که یک ستون در جدول چه نوع اطلاعاتی میتواند نگه دارد.
بدون تعیین درست Data Type:
- ممکن است حافظه سرور هدر برود.
- ممکن است عملکرد جستجو (Query Performance) پایین بیاید.
- ممکن است داده اشتباه وارد شود.
مثال ساده:
CREATE TABLE Students (
ID INT,
Name NVARCHAR(50),
BirthDate DATE
);
ID
→ فقط اعداد صحیح ذخیره میکند.Name
→ متن تا ۵۰ کاراکتر (شامل حروف فارسی و انگلیسی).BirthDate
→ فقط تاریخ ذخیره میشود، نه ساعت.
📌 اگر در این مثال برای BirthDate
به جای DATE
، نوع NVARCHAR
میگرفتیم:
- امکان ذخیره تاریخ اشتباه، یا حتی متن غیرتاریخی وجود داشت.
- مرتبسازی تاریخها بهدرستی انجام نمیشد.
- فضای بیشتری هم اشغال میشد.
2️⃣ دستهبندی کلی انواع دادهها در SQL Server
SQL Server صدها نوع داده دارد ولی همه آنها در ۵ گروه اصلی قرار میگیرند:
گروه کلی | مثالها |
---|---|
اعداد صحیح (Exact Integer) | INT , BIGINT , SMALLINT , TINYINT |
اعداد اعشاری و دقیق (Decimal & Approximate) | DECIMAL , NUMERIC , FLOAT , REAL |
متنی و کاراکتری (Character & Unicode) | CHAR , VARCHAR , NCHAR , NVARCHAR , TEXT , NTEXT |
تاریخ و زمان (Date & Time) | DATE , DATETIME , DATETIME2 , TIME |
دیگر انواع (Other/Special Types) | BIT , BINARY , UNIQUEIDENTIFIER , XML , VARBINARY |
3️⃣ انواع دادههای عددی (Numeric Data Types)
3.1 اعداد صحیح (Exact Integer Types)
برای ذخیره اعداد بدون اعشار:
نوع داده | اندازه (بایت) | محدوده قابل ذخیره |
---|---|---|
TINYINT | 1 | 0 تا 255 |
SMALLINT | 2 | -32,768 تا 32,767 |
INT | 4 | -2,147,483,648 تا 2,147,483,647 |
BIGINT | 8 | تقریبا ±9 کوادریلیون |
مثال:
CREATE TABLE Test_Integer (
Age TINYINT,
Score INT
);
📌 نکته:
- همیشه کوچکترین نوعی که نیاز داری انتخاب کن تا حافظه بیهوده مصرف نشود.
TINYINT
برای سن افراد مناسب است چون کسی سنش بالای 255 نمیرود.
3.2 اعداد اعشاری (Decimal & Approximate Types)
نوع داده | توضیح | اندازه |
---|---|---|
DECIMAL(p, s) | عدد دقیق با طول تعریفشده | بسته به p |
NUMERIC(p, s) | شبیه Decimal | مشابه |
FLOAT(n) | عدد تقریبی با اعشار شناور | 4 یا 8 بایت |
REAL | نسخه کوچکتر Float | 4 بایت |
مثال:
CREATE TABLE Products (
Price DECIMAL(10, 2), -- تا 10 رقم، 2 رقم اعشار
Weight FLOAT
);
📌 نکات:
- برای کارهای مالی همیشه
DECIMAL
بهتر ازFLOAT
است چون دقیقتر و بدون خطای اعشاری است. FLOAT
وREAL
برای محاسبات تقریبی یا علمی مناسب هستند.
4️⃣ انواع دادههای متنی (Character Data Types)
4.1 بدون Unicode (فقط انگلیسی و چند زبان دیگر)
CHAR(n)
→ طول ثابت، پر میکند با فاصلهVARCHAR(n)
→ طول متغیر، ذخیره واقعی طول متن
مثال:
CREATE TABLE Users_EN (
Username VARCHAR(50), -- طول متغیر
PostalCode CHAR(10) -- همیشه 10 کاراکتر
);
4.2 با Unicode (شامل فارسی)
NCHAR(n)
NVARCHAR(n)
هر کاراکتر 2 بایت میگیرد، پیشوندN
در مقادیر متنی برای ذخیره صحیح فارسی مهم است.
مثال:
CREATE TABLE Users_FA (
FullName NVARCHAR(100),
Address NVARCHAR(MAX)
);
INSERT INTO Users_FA (FullName) VALUES (N'علی رضایی');
4.3 متن طولانی
TEXT
وNTEXT
→ قدیمی و منسوخ (deprecated)- جایگزین:
VARCHAR(MAX)
یاNVARCHAR(MAX)
📌 نکته مهم:
اگر نیاز به نگهداری داده فارسی داری، همیشه NVARCHAR
استفاده کن تا حروف بههمریخته نشوند.
5️⃣ انواع دادههای تاریخ و زمان (Date and Time Data Types)
نوع | فرمت | محدوده |
---|---|---|
DATE | YYYY-MM-DD | 0001-01-01 تا 9999-12-31 |
DATETIME | YYYY-MM-DD hh:mm:ss | 1753 تا 9999 |
DATETIME2 | دقت بیشتر ثانیه | 0001 تا 9999 |
SMALLDATETIME | دقیقه دقیق | 1900 تا 2079 |
TIME | فقط زمان | 00:00:00 تا 23:59:59 |
مثال:
CREATE TABLE Orders (
OrderDate DATETIME DEFAULT GETDATE()
);
📌 توصیه:
- اگر فقط تاریخ لازم داری →
DATE
- اگر دقت بالا میخواهی →
DATETIME2
6️⃣ انواع دادههای منطقی و باینری
BIT
→ مقدار 0 یا 1 (true/false)BINARY(n)
→ طول ثابت باینریVARBINARY(n)
→ طول متغیر باینریIMAGE
→ قدیمی، جایگزینشVARBINARY(MAX)
مثال:
CREATE TABLE Files (
FileName NVARCHAR(200),
FileData VARBINARY(MAX)
);
7️⃣ انواع دادههای ویژه (Special Data Types)
UNIQUEIDENTIFIER
→ شناسه یکتا (GUID)ROWVERSION
/TIMESTAMP
→ کنترل تغییرات رکوردSQL_VARIANT
→ نگهداری مقادیر از انواع مختلفXML
→ ذخیره مستقیم داده XML- JSON → پشتیبانی در
NVARCHAR
همراه توابع JSON
مثال:
CREATE TABLE Sessions (
SessionID UNIQUEIDENTIFIER DEFAULT NEWID(),
Data XML
);
8️⃣ قوانین انتخاب نوع داده مناسب
- کوچکتر = بهتر (در سرعت و مصرف حافظه)
- استفاده از نوع صحیح برای نوع داده (مثلاً تاریخ را متن نگیرید)
- پرهیز از MAX مگر واقعاً نیاز باشد
- انتخاب Unicode در صورت نیاز به زبانهای غیرانگلیسی
9️⃣ تبدیل نوع دادهها (CAST و CONVERT)
CAST:
SELECT CAST('2025-09-08' AS DATETIME);
CONVERT:
SELECT CONVERT(VARCHAR(10), GETDATE(), 103); -- فرمت DD/MM/YYYY
📌 CAST → استاندارد SQL
📌 CONVERT → امکانات فرمتدهی بیشتر
🔟 اشتباهات رایج
- ذخیره تاریخ در
NVARCHAR
- استفاده بیش از حد از
NVARCHAR(MAX)
- انتخاب
FLOAT
برای محاسبات مالی - نگرفتن Unicode برای زبان فارسی
1️⃣1️⃣ تمرین عملی
- ایجاد جدول با تمام انواع دادهها:
CREATE TABLE DataType_Test (
ID INT PRIMARY KEY,
FullName NVARCHAR(100),
BirthDate DATE,
Salary DECIMAL(12, 2),
Active BIT,
ProfileImage VARBINARY(MAX),
RegisterDate DATETIME DEFAULT GETDATE()
);
- درج داده تستی و بازیابی:
INSERT INTO DataType_Test (ID, FullName, BirthDate, Salary, Active)
VALUES (1, N'محمد عباسی', '1990-05-12', 4500.75, 1);
SELECT * FROM DataType_Test;
1️⃣2️⃣ جمعبندی
- Data Type پایه طراحی جدول است.
- انتخاب درست باعث صرفهجویی در حافظه و بهبود عملکرد میشود.
- همیشه با توجه به نوع داده واقعی و نیاز پروژه انتخاب کن.
- از Unicode برای زبان فارسی استفاده کن.
- تاریخها را به صورت Date/DateTime ذخیره کن، نه متن.