انواع داده در SQL Server؛ راهنمای کامل انتخاب Data Type مناسب
هر ستون در یک جدول SQL Server باید نام و Data Type مشخصی داشته باشد. Data Type تعیین میکند ستون چه نوع مقداری را میپذیرد، چه مقدار فضای ذخیرهسازی مصرف میکند، چه محدودهای از داده را نگه میدارد و SQL Server چگونه هنگام مقایسه، مرتبسازی، محاسبه و تبدیل با آن رفتار میکند.
در این مقاله، انواع داده مطرحشده برای SQL Server در مرجع W3Schools بهصورت فارسی، بازنویسیشده و همراه با مثالهای عملی بررسی میشوند. نام انواع داده، دستورات و اصطلاحات SQL مانند nvarchar، decimal، datetime2 و CREATE TABLE بدون ترجمه باقی ماندهاند تا متن برای استفاده عملی و جستوجوی فنی مناسب باشد.
Data Type در SQL Server چیست؟
Data Type مشخصهای است که نوع داده قابل نگهداری در یک ستون، متغیر، پارامتر یا عبارت را تعیین میکند. برای نمونه، ستونی با نوع int برای اعداد صحیح طراحی شده است، در حالی که nvarchar برای متن و datetime2 برای تاریخ و زمان کاربرد دارد.
انتخاب نوع داده فقط یک تصمیم ظاهری نیست. این انتخاب مستقیماً بر موارد زیر اثر میگذارد:
- حجم جدول، Index و فایلهای Backup
- سرعت خواندن، نوشتن، مقایسه و مرتبسازی دادهها
- دقت محاسبات عددی و مالی
- پشتیبانی صحیح از متن فارسی و سایر زبانها
- امکان ذخیره محدوده مناسب تاریخ، زمان و اعداد
- احتمال رخدادن خطای تبدیل، Overflow یا از دست رفتن دقت
نکته مهم: نام یک Data Type در Databaseهای مختلف لزوماً رفتار یکسانی ندارد. حتی هنگامی که نام نوع داده مشابه است، محدوده، اندازه و جزئیات آن ممکن است در SQL Server، MySQL یا سیستمهای دیگر متفاوت باشد. بنابراین هنگام طراحی نهایی، مستندات همان Database و همان نسخه را بررسی کنید.
گروههای اصلی Data Type در SQL Server
در دستهبندی آموزشی این مقاله، انواع داده SQL Server در چهار گروه بررسی میشوند:
- String Data Types: برای متن، کاراکتر و داده Binary
- Numeric Data Types: برای اعداد صحیح، اعشاری، مالی و تقریبی
- Date and Time Data Types: برای تاریخ، ساعت و Offset منطقه زمانی
- Other Data Types: برای GUID، XML، Table Variable و کاربردهای خاص
String Data Types در SQL Server
انواع داده متنی SQL Server به دو شکل کلی ثابت و متغیر ارائه میشوند. نوع ثابت مانند char یا nchar همیشه فضای تعریفشده را در نظر میگیرد، اما نوع متغیر مانند varchar یا nvarchar متناسب با طول واقعی مقدار ذخیرهشده فضا مصرف میکند. انواع binary و varbinary نیز برای نگهداری Byteها طراحی شدهاند.
| Data Type |
توضیح |
حداکثر طول |
فضای ذخیرهسازی |
char(n) |
داده متنی با طول ثابت. مقدار n باید بین 1 و 8000 باشد. |
8000 |
تقریباً n Byte |
varchar(n) |
داده متنی با طول متغیر. مقدار n باید بین 1 و 8000 باشد. |
8000 |
طول واقعی داده بهعلاوه سربار مدیریت طول |
varchar(max) |
داده متنی با طول متغیر برای محتوای بسیار بزرگ. |
تا حدود 2 GB |
وابسته به حجم مقدار |
nchar(n) |
داده متنی Unicode با طول ثابت. مقدار n باید بین 1 و 4000 باشد. |
4000 واحد تعریفشده |
در حالت رایج حدود 2 × n Byte |
nvarchar(n) |
داده متنی Unicode با طول متغیر. مقدار n باید بین 1 و 4000 باشد. |
4000 واحد تعریفشده |
در حالت رایج حدود 2 × n Byte بهعلاوه سربار |
nvarchar(max) |
داده متنی Unicode با طول متغیر برای متنهای بسیار بزرگ. |
تا حدود 2 GB |
وابسته به حجم مقدار |
binary(n) |
داده Binary با طول ثابت. مقدار n باید بین 1 و 8000 باشد. |
8000 Byte |
n Byte |
varbinary(n) |
داده Binary با طول متغیر. مقدار n باید بین 1 و 8000 باشد. |
8000 Byte |
طول واقعی داده بهعلاوه سربار |
varbinary(max) |
داده Binary با طول متغیر برای فایل یا محتوای حجیم. |
تا حدود 2 GB |
وابسته به حجم مقدار |
تفاوت char و varchar
از char(n) زمانی استفاده کنید که طول مقدار تقریباً همیشه ثابت است؛ برای مثال کد کشور دوحرفی، کد ثابت یا شناسهای با طول مشخص. اگر طول داده متغیر است، varchar(n) معمولاً فضای کمتری مصرف میکند.
CREATE TABLE CountryCodes ( CountryCode char(2) NOT NULL, CountryName varchar(100) NOT NULL );
تفاوت nchar و nvarchar
nchar و nvarchar برای نگهداری Unicode طراحی شدهاند. برای نام افراد، عنوان کالا، آدرس، توضیحات و هر دادهای که شامل فارسی یا چند زبان است، nvarchar انتخابی قابل پیشبینی و رایج محسوب میشود.
CREATE TABLE Customers ( CustomerId int IDENTITY(1,1) PRIMARY KEY, FullName nvarchar(150) NOT NULL, City nvarchar(100) NULL ); INSERT INTO Customers (FullName, City) VALUES (N'علی رضایی', N'شیراز');
نکته درباره Unicode: در SQL Serverهای جدید، char و varchar با Collation دارای UTF-8 میتوانند دامنه کامل Unicode را ذخیره کنند. بااینحال، اگر تنظیم Collation پروژه مشخص نیست یا سازگاری گستردهتری میخواهید، استفاده از nvarchar برای متن فارسی همچنان انتخاب سادهتر و مطمئنتری است.
چه زمانی از max استفاده نکنیم؟
استفاده بیدلیل از varchar(max) یا nvarchar(max) باعث میشود مدل داده محدودیت واقعی کسبوکار را نشان ندهد و در برخی عملیات، هزینه حافظه و پردازش افزایش پیدا کند. برای ایمیل، نام، شماره پیگیری یا عنوان محصول معمولاً یک طول مشخص مانند nvarchar(150) بهتر از nvarchar(max) است.
کاربرد binary و varbinary
binary و varbinary برای Byteهای خام استفاده میشوند؛ مانند Hash، Token، داده رمزنگاریشده یا فایل کوچک. برای طول ثابت مثل Hash با اندازه مشخص، binary(n) مناسب است. برای طول متغیر از varbinary(n) و برای داده حجیم از varbinary(max) استفاده میشود.
CREATE TABLE FileHashes ( FileId bigint IDENTITY(1,1) PRIMARY KEY, Sha256Hash binary(32) NOT NULL, SmallPayload varbinary(8000) NULL );
Numeric Data Types در SQL Server
انواع عددی را میتوان به سه خانواده اصلی تقسیم کرد: اعداد صحیح، اعداد دقیق اعشاری و اعداد تقریبی. انتخاب نادرست میان decimal و float یا میان smallint و bigint میتواند باعث اتلاف فضا، خطای محاسباتی یا محدودیت زودهنگام شود.
| Data Type |
محدوده یا کاربرد |
فضای ذخیرهسازی |
bit |
مقادیر 0، 1 یا NULL |
بهینهسازیشده برای مقدار منطقی |
tinyint |
اعداد صحیح از 0 تا 255 |
1 Byte |
smallint |
اعداد صحیح از -32,768 تا 32,767 |
2 Byte |
int |
اعداد صحیح از -2,147,483,648 تا 2,147,483,647 |
4 Byte |
bigint |
اعداد صحیح بسیار بزرگ از -9,223,372,036,854,775,808 تا 9,223,372,036,854,775,807 |
8 Byte |
decimal(p,s) |
عدد دقیق با Precision و Scale ثابت؛ p بین 1 تا 38 و s بین 0 تا p |
5 تا 17 Byte |
numeric(p,s) |
از نظر عملکرد معادل decimal(p,s) |
5 تا 17 Byte |
smallmoney |
مقادیر مالی از -214,748.3648 تا 214,748.3647 |
4 Byte |
money |
مقادیر مالی از -922,337,203,685,477.5808 تا 922,337,203,685,477.5807 |
8 Byte |
float(n) |
عدد تقریبی Floating Point؛ مقدار n نوع ذخیرهسازی 4 یا 8 Byte را تعیین میکند. |
4 یا 8 Byte |
real |
عدد تقریبی Floating Point با دقت کمتر از float(53) |
4 Byte |
انتخاب میان tinyint، smallint، int و bigint
نوع عدد صحیح باید با بیشترین مقدار واقعی ستون هماهنگ باشد. برای وضعیت یا امتیازی در محدوده 0 تا 255، tinyint کافی است. برای بیشتر شناسههای معمول، int کاربرد فراوانی دارد؛ اما سامانههایی با رشد بسیار زیاد، لاگهای حجیم یا رخدادهای پیوسته ممکن است از ابتدا به bigint نیاز داشته باشند.
نمونه انتخاب نوع عدد صحیح
- سن یا درصد محدود:
tinyint
- تعداد محدود در یک سامانه کوچک:
smallint
- شناسه و شمارنده عمومی:
int
- شناسه رخدادها و لاگهای بسیار حجیم:
bigint
Precision و Scale در decimal
در decimal(p,s)، پارامتر p تعداد کل رقمها و پارامتر s تعداد رقمهای سمت راست ممیز است. برای مثال، decimal(12,2) میتواند حداکثر 10 رقم قبل از ممیز و 2 رقم پس از ممیز نگه دارد.
CREATE TABLE Products ( ProductId int IDENTITY(1,1) PRIMARY KEY, ProductName nvarchar(200) NOT NULL, UnitPrice decimal(18,2) NOT NULL, DiscountRate decimal(5,2) NOT NULL DEFAULT 0, StockQuantity int NOT NULL DEFAULT 0 );
تفاوت decimal و float
decimal مقدار دقیق نگه میدارد، اما float و real انواع تقریبی هستند. بنابراین برای قیمت، مبلغ، مالیات، درصد مالی یا هر محاسبهای که اختلاف کوچک قابل قبول نیست، از decimal استفاده کنید. float برای اندازهگیریهای علمی، تحلیل عددی و دادههایی مناسب است که نمایش تقریبی آنها پذیرفته میشود.
DECLARE @ExactValue decimal(10,2) = 0.10; DECLARE @ApproxValue float = 0.10; SELECT @ExactValue AS ExactValue, @ApproxValue AS ApproxValue;
قاعده کاربردی: برای پول و محاسبات حسابداری، decimal(p,s) را با Precision و Scale صریح انتخاب کنید. استفاده از float برای مبلغ ممکن است در مقایسه یا جمعهای تکراری نتیجهای با اختلاف بسیار کوچک ایجاد کند.
Date and Time Data Types در SQL Server
SQL Server انواع مختلفی برای نگهداری تاریخ و زمان دارد. تفاوت اصلی آنها در محدوده تاریخی، دقت، فضای ذخیرهسازی و پشتیبانی از Offset منطقه زمانی است.
| Data Type |
توضیح |
فضای ذخیرهسازی |
date |
فقط تاریخ، از 0001-01-01 تا 9999-12-31 |
3 Byte |
time |
فقط زمان، با دقت قابل تنظیم تا 100 Nanosecond |
3 تا 5 Byte |
datetime |
تاریخ و زمان از 1753-01-01 تا 9999-12-31، با دقت تقریبی 3.33 Millisecond |
8 Byte |
datetime2 |
تاریخ و زمان از 0001-01-01 تا 9999-12-31، با دقت قابل تنظیم تا 100 Nanosecond |
6 تا 8 Byte |
smalldatetime |
تاریخ و زمان از 1900-01-01 تا 2079-06-06، با دقت یک Minute |
4 Byte |
datetimeoffset |
مشابه datetime2 همراه با Time Zone Offset |
8 تا 10 Byte |
timestamp |
عدد Binary نسخه سطر که با درج یا تغییر سطر بهروزرسانی میشود؛ تاریخ و زمان واقعی نیست. |
8 Byte |
date و time
اگر فقط تاریخ تولد، تاریخ سررسید یا روز رویداد مهم است، date انتخاب مناسبی است. اگر فقط ساعت یا مدت زمانی در قالب ساعت لازم است، time از ذخیره بخش تاریخ جلوگیری میکند.
datetime یا datetime2؟
برای طراحیهای جدید معمولاً datetime2 بر datetime ترجیح داده میشود؛ زیرا محدوده تاریخی گستردهتر، دقت بیشتر و امکان انتخاب Precision دارد. برای نمونه، datetime2(0) ثانیه را بدون بخش اعشاری ذخیره میکند و datetime2(7) بیشترین دقت را ارائه میدهد.
CREATE TABLE Orders ( OrderId bigint IDENTITY(1,1) PRIMARY KEY, CustomerId int NOT NULL, OrderDate datetime2(0) NOT NULL DEFAULT SYSDATETIME(), DeliveryDate date NULL, TotalAmount decimal(18,2) NOT NULL );
datetimeoffset برای Offset منطقه زمانی
datetimeoffset علاوه بر تاریخ و زمان، Offset را نیز نگه میدارد؛ مانند +03:30. این نوع برای رخدادهایی که باید Offset زمان ثبتشده حفظ شود مفید است. توجه کنید که Offset با نام منطقه زمانی و قوانین تغییر ساعت تابستانی یکسان نیست.
DECLARE @EventTime datetimeoffset(0) = '2026-08-02T08:20:00+03:30'; SELECT @EventTime AS EventTime;
timestamp در SQL Server تاریخ نیست
در SQL Server، timestamp برخلاف نام آن، تاریخ یا ساعت واقعی را ذخیره نمیکند. این نام یک Synonym قدیمی و Deprecated برای rowversion است. برای ثبت زمان واقعی از datetime2 و برای کنترل همزمانی سطرها از rowversion استفاده کنید.
CREATE TABLE Documents ( DocumentId int IDENTITY(1,1) PRIMARY KEY, Title nvarchar(200) NOT NULL, UpdatedAt datetime2(0) NOT NULL DEFAULT SYSDATETIME(), RowVersion rowversion NOT NULL );
Other Data Types در SQL Server
SQL Server علاوه بر دادههای متنی، عددی و زمانی، چند نوع داده ویژه برای سناریوهای خاص ارائه میکند.
| Data Type |
کاربرد |
sql_variant |
نگهداری مقادیر با چند Data Type مختلف تا سقف مشخص؛ برخی انواع مانند text، ntext و timestamp را نمیپذیرد. |
uniqueidentifier |
نگهداری GUID با طول 16 Byte؛ مناسب شناسههای توزیعشده و یکتا در چند سیستم. |
xml |
نگهداری داده XML و امکان Query با قابلیتهای XML در SQL Server؛ حداکثر حجم در محدوده نوع بزرگ. |
cursor |
نگهداری Reference به Cursor برای پردازش سطربهسطر؛ معمولاً در طراحیهای Set-Based کمتر توصیه میشود. |
table |
نگهداری Result Set موقت در Table Variable یا پارامترهای جدولی برای پردازش بعدی. |
uniqueidentifier و GUID
uniqueidentifier برای شناسههایی مناسب است که باید در چند Server، Client یا سرویس بدون هماهنگی مرکزی تولید شوند. این نوع نسبت به int فضای بیشتری مصرف میکند و اگر مقدارهای کاملاً تصادفی در Clustered Index استفاده شوند، ممکن است Fragmentation را افزایش دهند.
CREATE TABLE ApiClients ( ClientId uniqueidentifier NOT NULL CONSTRAINT DF_ApiClients_ClientId DEFAULT NEWSEQUENTIALID(), ClientName nvarchar(150) NOT NULL, CONSTRAINT PK_ApiClients PRIMARY KEY (ClientId) );
xml
نوع xml برای دادهای مناسب است که واقعاً ساختار XML دارد و نیاز به اعتبارسنجی، Query یا پردازش XML در Database وجود دارد. اگر ساختار داده کاملاً رابطهای و پایدار است، شکستن آن به ستونها و جدولهای مناسب معمولاً Query و Indexگذاری سادهتری ایجاد میکند.
table و Table Variable
نوع table برای تعریف Table Variable و نگهداری مجموعهای موقت از سطرها کاربرد دارد. برای مجموعههای بزرگ، لازم است Table Variable با Temporary Table مانند #TempTable از نظر Execution Plan، Statistics و حجم داده مقایسه شود.
DECLARE @SelectedProducts table ( ProductId int PRIMARY KEY, Quantity int NOT NULL ); INSERT INTO @SelectedProducts (ProductId, Quantity) VALUES (101, 2), (205, 1); SELECT * FROM @SelectedProducts;
جدول مقایسه سریع برای انتخاب Data Type
| نیاز |
انتخاب پیشنهادی |
دلیل |
| نام، عنوان و آدرس فارسی |
nvarchar(n) |
پشتیبانی قابل پیشبینی از Unicode و طول متغیر |
| کد ثابت دو یا چندحرفی |
char(n) یا nchar(n) |
طول مقدار همیشه ثابت است |
| متن طولانی |
nvarchar(max) |
مناسب محتوای بزرگ Unicode، فقط در صورت نیاز واقعی |
| قیمت و مبلغ |
decimal(p,s) |
ذخیره دقیق و کنترل تعداد رقم اعشار |
| اندازهگیری علمی تقریبی |
float یا real |
مناسب محاسبات Floating Point |
| تاریخ بدون ساعت |
date |
فضای کمتر و معنی روشنتر |
| تاریخ و زمان عمومی |
datetime2 |
دقت و محدوده بهتر از datetime |
| تاریخ و زمان همراه Offset |
datetimeoffset |
حفظ Offset زمان ثبتشده |
| کنترل Optimistic Concurrency |
rowversion |
تشخیص تغییر نسخه سطر، نه ثبت زمان واقعی |
| شناسه توزیعشده |
uniqueidentifier |
امکان تولید GUID در چند سیستم |
مثال عملی: طراحی جدول کامل در SQL Server
در مثال زیر، برای هر ستون نوع دادهای متناسب با مفهوم آن انتخاب شده است. نام و توضیحات از nvarchar، مبلغ از decimal، وضعیت از bit، تاریخ ثبت از datetime2 و کنترل نسخه سطر از rowversion استفاده میکنند.
CREATE TABLE SalesOrders ( OrderId bigint IDENTITY(1,1) NOT NULL, PublicId uniqueidentifier NOT NULL CONSTRAINT DF_SalesOrders_PublicId DEFAULT NEWSEQUENTIALID(), CustomerName nvarchar(150) NOT NULL, CustomerEmail varchar(254) NULL, Description nvarchar(1000) NULL, TotalAmount decimal(18,2) NOT NULL, TaxRate decimal(5,2) NOT NULL DEFAULT 0, IsPaid bit NOT NULL DEFAULT 0, OrderDate datetime2(0) NOT NULL DEFAULT SYSDATETIME(), ClientTime datetimeoffset(0) NULL, Attachment varbinary(max) NULL, RowVersion rowversion NOT NULL, CONSTRAINT PK_SalesOrders PRIMARY KEY (OrderId), CONSTRAINT UQ_SalesOrders_PublicId UNIQUE (PublicId), CONSTRAINT CK_SalesOrders_TotalAmount CHECK (TotalAmount >= 0), CONSTRAINT CK_SalesOrders_TaxRate CHECK (TaxRate BETWEEN 0 AND 100) );
این ساختار چند اصل مهم را رعایت میکند: اندازه متنها محدود شده، مقادیر مالی دقیق هستند، Constraints اعتبار داده را کنترل میکنند و rowversion امکان تشخیص تغییر همزمان سطر را فراهم میسازد.
چگونه Data Type ستونهای موجود را بررسی کنیم؟
برای مشاهده نوع داده، طول، Precision و Scale ستونها میتوان از Viewهای سیستمی SQL Server استفاده کرد.
SELECT s.name AS SchemaName, t.name AS TableName, c.name AS ColumnName, ty.name AS DataType, c.max_length AS MaxLength, c.precision AS PrecisionValue, c.scale AS ScaleValue, c.is_nullable AS IsNullable FROM sys.columns AS c INNER JOIN sys.tables AS t ON c.object_id = t.object_id INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id INNER JOIN sys.types AS ty ON c.user_type_id = ty.user_type_id ORDER BY s.name, t.name, c.column_id;
اشتباهات رایج در انتخاب Data Type
- استفاده از
nvarchar(max) برای همه متنها: طول واقعی ستون را مشخص کنید و فقط برای متنهای واقعاً بزرگ از max استفاده کنید.
- ذخیره عدد در ستون متنی: شماره سفارش عددی، مبلغ و تعداد را در نوع مناسب عددی ذخیره کنید تا Sort و محاسبه درست انجام شود.
- ذخیره تاریخ در
varchar: تاریخ متنی باعث ابهام Format، تبدیل اضافی و Query ضعیفتر میشود.
- استفاده از
float برای پول: انواع تقریبی برای محاسبات مالی مناسب نیستند؛ از decimal استفاده کنید.
- انتخاب
bigint بدون نیاز: این نوع نسبت به int فضای بیشتری در جدول و Index مصرف میکند.
- درک اشتباه از
timestamp: این نوع تاریخ نیست و بهتر است با نام rowversion استفاده شود.
- ندادن طول به
varchar یا nvarchar: طول را صریح بنویسید؛ زیرا مقدار پیشفرض در Contextهای مختلف میتواند نتیجه ناخواسته ایجاد کند.
- انتخاب نوع فقط بر اساس داده امروز: رشد منطقی سامانه، بیشترین مقدار آینده و قواعد کسبوکار را نیز در نظر بگیرید.
بهترین روشها برای انتخاب Data Type
- کوچکترین نوع دادهای را انتخاب کنید که محدوده فعلی و رشد منطقی آینده را پوشش دهد.
- برای متن فارسی، Collation و Unicode را آگاهانه تعیین کنید و در حالت عمومی از
nvarchar استفاده کنید.
- برای مبالغ و اعداد دقیق از
decimal(p,s) با Precision و Scale صریح استفاده کنید.
- برای طراحی جدید تاریخ و زمان، ابتدا
datetime2 را بررسی کنید.
- برای زمان واقعی از
timestamp استفاده نکنید؛ timestamp همان Synonym قدیمی rowversion است.
- طول ستونهای متنی را براساس Constraint واقعی کسبوکار تعیین کنید.
- نوع داده ستونهای مرتبط در Foreign Key و Join را یکسان نگه دارید.
- از تبدیل ضمنی میان Data Typeهای متفاوت در شرطهای
WHERE و JOIN جلوگیری کنید.
- قبل از تغییر Data Type یک ستون پرحجم، تأثیر آن بر Index، Lock، Log و زمان Migration را آزمایش کنید.
- نوع داده را همراه با
NULL/NOT NULL، DEFAULT و CHECK طراحی کنید تا مدل داده کامل باشد.
پرسشهای متداول
برای ذخیره متن فارسی در SQL Server چه نوعی مناسب است؟
در سناریوی عمومی، nvarchar(n) انتخاب مناسبی است. هنگام درج Literal فارسی نیز از پیشوند N مانند N'متن فارسی' استفاده کنید. در SQL Serverهای جدید، varchar با UTF-8 Collation نیز میتواند Unicode را پشتیبانی کند، اما این تصمیم باید آگاهانه و هماهنگ با Collation باشد.
برای قیمت از money استفاده کنیم یا decimal؟
money یک نوع دقیق با Scale ثابت چهاررقمی است، اما decimal(p,s) کنترل شفافتری بر تعداد کل رقمها و رقمهای اعشار میدهد. در بسیاری از طراحیهای مالی، decimal(18,2) یا Scale متناسب با واحد پول انتخاب رایجتری است.
آیا numeric و decimal تفاوت دارند؟
در SQL Server، numeric و decimal از نظر عملکرد معادل و Synonym یکدیگر هستند.
برای شناسه جدول int بهتر است یا uniqueidentifier؟
int کوچکتر و برای Index معمولاً کارآمدتر است. uniqueidentifier زمانی ارزشمند است که تولید شناسه بهصورت توزیعشده، ادغام داده چند سیستم یا آشکار نکردن شمارنده داخلی لازم باشد. تصمیم باید براساس معماری سامانه گرفته شود.
تفاوت datetime2 و datetimeoffset چیست؟
datetime2 تاریخ و زمان را بدون Offset ذخیره میکند. datetimeoffset همان اطلاعات را همراه با Offset مانند +03:30 نگه میدارد.
آیا timestamp زمان آخرین تغییر سطر را نشان میدهد؟
خیر. timestamp/rowversion یک مقدار Binary افزایشی در سطح Database است و زمان ساعت را نشان نمیدهد. برای ثبت زمان تغییر، یک ستون datetime2 جداگانه نیاز است.
جمعبندی
انتخاب درست Data Type یکی از پایههای طراحی سالم SQL Server است. برای متن فارسی معمولاً nvarchar، برای مبلغ decimal، برای تاریخ و زمان جدید datetime2، برای شناسه توزیعشده uniqueidentifier و برای کنترل نسخه سطر rowversion گزینههای مهمی هستند. نوع داده باید نه بزرگتر از نیاز و نه کوچکتر از رشد منطقی آینده انتخاب شود.
چکلیست نهایی انتخاب Data Type
- نوع واقعی داده و عملیات موردنیاز روی آن را مشخص کنید.
- حداقل و حداکثر مقدار یا طول را تخمین بزنید.
- برای متن، نیاز به Unicode و Collation را بررسی کنید.
- برای عدد، دقیق یا تقریبی بودن مقدار را مشخص کنید.
- برای
decimal، Precision و Scale را صریح تعیین کنید.
- برای تاریخ، نیاز به زمان، دقت و Offset را مشخص کنید.
- از
max، bigint و انواع بزرگ فقط با دلیل استفاده کنید.
- Data Type ستونهای Join و Foreign Key را یکسان نگه دارید.
- Constraintهای
NOT NULL، DEFAULT و CHECK را همراه نوع داده طراحی کنید.
- مدل را با داده واقعی و Queryهای پرتکرار آزمایش کنید.
این مقاله ترجمه لفظبهلفظ منبع نیست؛ محتوای بخش SQL Server منبع W3Schools بهصورت آموزشی و مستقل بازنویسی شده و نکات فنی مهم با مستندات Microsoft تطبیق داده شده است.