Silent Truncation دادهها در SQL Server
برش پنهان دادهها (Silent Truncation) در SQL Server زمانی اتفاق میافتد که دادههای در حال درج در یک ستون، بزرگتر از اندازه تعریف شده برای آن ستون باشند و این دادهها بدون هیچ هشدار یا پیغام خطایی قطع میشوند. این موضوع میتواند به مشکلات جدی در یکپارچگی دادهها منجر شود، زیرا دادههای بریده شده معمولاً مطلوب نیستند و اطلاعات ارزشمندی را از دست میدهید. در این مقاله به چند نمونه رایج از وقوع این پدیده و راههای جلوگیری از آن خواهیم پرداخت.
ابتدا با مثالی از نوع داده CHAR شروع میکنیم.
CREATE TABLE MyTestChar (
MyCharCol CHAR(5)
);
INSERT INTO MyTestChar VALUES ('abcde');
INSERT INTO MyTestChar VALUES ('abcdefg');
SELECT * FROM MyTestChar;
DROP TABLE MyTestChar;
همانطور که مشاهده میکنید، مقدار ‘abcdefg’ به ‘abcde’ کوتاه شده است، زیرا ستون به صورت `CHAR(5)` تعریف شده بود. SQL Server هیچ خطایی برنگرداند، اما دادهها را به صورت پنهان برش داد. اینجاست که ممکن است با مشکلات یکپارچگی دادهها روبرو شوید، چرا که مقداری که تصور میکردید به طور کامل درج شده، در واقع کوتاه شده است.
اکنون به مثالی با استفاده از نوع داده `VARCHAR` میپردازیم.
CREATE TABLE MyTestVarChar (
MyVarCharCol VARCHAR(5)
);
INSERT INTO MyTestVarChar VALUES ('abcde');
INSERT INTO MyTestVarChar VALUES ('abcdefg');
SELECT * FROM MyTestVarChar;
DROP TABLE MyTestVarChar;
باز هم، همان رفتار قبلی را مشاهده میکنیم؛ مقدار ‘abcdefg’ بدون هیچ هشداری از سوی SQL Server به ‘abcde’ کوتاه شده است. بنابراین، هر دو نوع داده `CHAR` و `VARCHAR` در مورد برش پنهان، رفتار مشابهی دارند. این نکته کلیدی برای حفظ کیفیت دادهها در پایگاه داده شماست.
این هم نمونه دیگری از نحوه وقوع این پدیده. ابتدا جدولی با مقداری ایجاد میکنیم که در ستون جا میشود، سپس با استفاده از `ALTER TABLE` اندازه ستون را کاهش میدهیم.
CREATE TABLE MyTestVarChar2 (
MyVarCharCol2 VARCHAR(10)
);
INSERT INTO MyTestVarChar2 VALUES ('abcdefg');
ALTER TABLE MyTestVarChar2 ALTER COLUMN MyVarCharCol2 VARCHAR(5);
INSERT INTO MyTestVarChar2 VALUES ('abcdefghij');
SELECT * FROM MyTestVarChar2;
DROP TABLE MyTestVarChar2;
در این مثال، ابتدا جدولی با ستون `VARCHAR(10)` ایجاد کرده و مقدار ‘abcdefg’ را درج میکنیم. سپس با دستور `ALTER TABLE`، اندازه ستون را به `VARCHAR(5)` تغییر میدهیم. در ادامه، سعی میکنیم مقدار جدید ‘abcdefghij’ که ۱۰ کاراکتر طول دارد را درج کنیم. همانطور که مشاهده میشود، مقدار اول ‘abcdefg’ دست نخورده باقی مانده، اما مقدار دوم ‘abcdefghij’ به ‘abcde’ برش خورده است. باز هم، SQL Server هیچ خطایی گزارش نمیدهد و صرفاً دادهها را کوتاه میکند. بنابراین، هنگام تغییر اندازه ستونها باید بسیار دقت کنید که دادههای جدید شما در اندازه جدید ستون جای بگیرند، در غیر این صورت با خطر از دست دادن اطلاعات مهم روبرو خواهید شد.
مثال دیگری از برش پنهان را هنگام تعریف یک متغیر و عدم تعیین طول آن بررسی میکنیم.
DECLARE @MyVar VARCHAR;
SET @MyVar = 'abcdefghij';
SELECT @MyVar AS TruncatedValue;
هنگامی که یک متغیر `VARCHAR` یا `NVARCHAR` را بدون تعیین طول تعریف میکنید، به طور پیشفرض طول آن ۱ در نظر گرفته میشود. همانطور که در خروجی بالا مشاهده میشود، متغیر `@MyVar` به حرف ‘a’ کوتاه شده است. بنابراین، همیشه توصیه میشود که برای متغیرهای `VARCHAR` و `NVARCHAR` خود طول مشخصی را تعیین کنید تا از این نوع برشهای ناخواسته جلوگیری شود و از سلامت دادههای خود اطمینان حاصل کنید.
این هم نمونه دیگری از نحوه کوتاه شدن دادهها هنگام استفاده از یک زیرکوئری (subquery).
CREATE TABLE MyTestVarChar3 (
MyVarCharCol3 VARCHAR(5)
);
INSERT INTO MyTestVarChar3 VALUES ('abcde');
INSERT INTO MyTestVarChar3 SELECT 'abcdefghij';
SELECT * FROM MyTestVarChar3;
DROP TABLE MyTestVarChar3;
همانطور که مشاهده میشود، مقدار ‘abcdefghij’ به ‘abcde’ کوتاه شده است. باز هم، هیچ هشدار یا پیغام خطایی تولید نشد. این یکی دیگر از موقعیتهایی است که دادهها میتوانند بدون اطلاع شما به صورت پنهان کوتاه شوند. بنابراین، هنگام درج دادهها با استفاده از یک زیرکوئری، اطمینان حاصل کنید که ستون مقصد شما قادر به نگهداری تمام دادههایی است که قصد درج آنها را دارید. با درک این سناریوها و اعمال بهترین روشها، میتوانید از برش پنهان دادهها در SQL Server جلوگیری کرده و یکپارچگی دادههای خود را تضمین کنید.