📚 فصل ۱۰: انواع دادهها (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 ذخیره کن، نه متن.