📚 فصل ۱۰: انواع داده‌ها (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)

برای ذخیره اعداد بدون اعشار:

نوع دادهاندازه (بایت)محدوده قابل ذخیره
TINYINT10 تا 255
SMALLINT2-32,768 تا 32,767
INT4-2,147,483,648 تا 2,147,483,647
BIGINT8تقریبا ±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نسخه کوچک‌تر Float4 بایت

مثال:

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)

نوعفرمتمحدوده
DATEYYYY-MM-DD0001-01-01 تا 9999-12-31
DATETIMEYYYY-MM-DD hh:mm:ss1753 تا 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️⃣ قوانین انتخاب نوع داده مناسب

  1. کوچکتر = بهتر (در سرعت و مصرف حافظه)
  2. استفاده از نوع صحیح برای نوع داده (مثلاً تاریخ را متن نگیرید)
  3. پرهیز از MAX مگر واقعاً نیاز باشد
  4. انتخاب 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️⃣ تمرین عملی

  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()
);
  1. درج داده تستی و بازیابی:
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 ذخیره کن، نه متن.
محمد وب‌سایت

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *