راهنمای جامع جهانیسازی (Globalization) در SQL Server: از مجموعه کاراکتر تا مرتبسازی
در دنیای امروز، پایگاههای داده اغلب با دادههایی از زبانها، مناطق و فرهنگهای مختلف سروکار دارند. برای اطمینان از اینکه برنامههای کاربردی به درستی با این تنوع کار میکنند و اطلاعات را به صورت صحیح نمایش میدهند، مفهوم جهانیسازی (Globalization) در SQL Server حیاتی است. این مقاله به بررسی عمیق جوانب مختلف جهانیسازی در SQL Server میپردازد، از درک مجموعههای کاراکتر و Collationها گرفته تا نحوه مدیریت تاریخ، زمان و قالبهای عددی. با مطالعه این راهنما، خواهید آموخت چگونه دیتابیسها و برنامههای خود را برای پشتیبانی از کاربران در سراسر جهان بهینهسازی کنید.
جهانیسازی چیست؟
جهانیسازی (Globalization) فرآیند طراحی و توسعه نرمافزار به گونهای است که بتواند با زبانها، تفاوتهای منطقهای و الزامات فنی یک بازار هدف سازگار شود. این مفهوم شامل بینالمللیسازی (Internationalization یا i18n) و محلیسازی (Localization یا l10n) است.
- بینالمللیسازی (i18n): آمادهسازی برنامه برای پشتیبانی از چندین زبان و منطقه بدون نیاز به تغییرات مهندسی در کد.
- محلیسازی (l10n): فرآیند انطباق برنامه بینالمللیشده برای یک منطقه یا زبان خاص، که شامل ترجمه متن، تنظیم قالبهای تاریخ و زمان، واحد پول و مرتبسازی است.
مجموعه کاراکترها (Character Sets)
مجموعه کاراکترها مجموعهای از نمادها و کدگذاریهای عددی متناظر با آنها هستند. در SQL Server، دو نوع اصلی از مجموعههای کاراکتر وجود دارد: Non-Unicode و Unicode.
- Non-Unicode (مانند ASCII یا ANSI): این مجموعهها معمولاً از یک بایت برای هر کاراکتر استفاده میکنند و تنها میتوانند 256 کاراکتر مختلف را نمایش دهند. این امر آنها را برای زبانهایی با تعداد کاراکترهای محدود مانند انگلیسی مناسب میسازد، اما برای زبانهایی با کاراکترهای بیشتر (مانند فارسی، چینی، ژاپنی) ناکافی هستند. انواع دادهای مانند
CHARوVARCHARاز این نوع مجموعهها استفاده میکنند. - Unicode (مانند UTF-16): این مجموعهها از دو بایت (یا بیشتر) برای هر کاراکتر استفاده میکنند و میتوانند میلیونها کاراکتر مختلف را نمایش دهند. این امر آنها را برای پشتیبانی از تقریباً تمام زبانهای دنیا ایدهآل میکند. انواع دادهای مانند
NCHARوNVARCHARاز این نوع مجموعهها استفاده میکنند.
برای ذخیره دادههای چندزبانه، همواره توصیه میشود از انواع داده NCHAR و NVARCHAR استفاده کنید تا از مشکلات مربوط به نمایش کاراکترها جلوگیری شود، حتی اگر در ابتدا به نظر برسد که فقط با یک زبان کار میکنید.
Collationها
Collation مجموعهای از قوانین است که نحوه مرتبسازی، مقایسه و مدیریت حساسیت به حروف کوچک و بزرگ، علائم نگارشی و پهنای کاراکترها را در یک مجموعه کاراکتر تعریف میکند. این قوانین برای هر پایگاه داده، ستون یا حتی یک عبارت در SQL Server قابل تنظیم هستند. یک Collation نمونه میتواند به شکل SQL_Latin1_General_CP1_CI_AS باشد که هر بخش آن معنای خاصی دارد:
- `SQL_` : نشاندهنده یک Collation استاندارد SQL Server است.
- `Latin1_General` : زبان یا گروه زبان را مشخص میکند (در اینجا، زبانهای اروپای غربی).
- `CP1` : Code Page مورد استفاده را نشان میدهد (در اینجا، Code Page 1252).
- `CI` : Case-Insensitive (بیتفاوت به حروف کوچک و بزرگ) است.
- `AS` : Accent-Sensitive (حساس به علائم نگارشی) است.
حساسیت به حروف (Case Sensitivity – CI/CS)
این ویژگی مشخص میکند که آیا SQL Server در هنگام مقایسه یا مرتبسازی رشتهها، حروف بزرگ و کوچک را یکسان در نظر میگیرد یا متفاوت.
- CI (Case-Insensitive): “Apple” و “apple” یکسان در نظر گرفته میشوند.
- CS (Case-Sensitive): “Apple” و “apple” متفاوت در نظر گرفته میشوند.
مثال برای جستجو با Collation حساس به حروف (CS):
SELECT 'A' COLLATE Latin1_General_CS_AS = 'a' COLLATE Latin1_General_CS_AS;
-- نتیجه: 0 (False)
حساسیت به علائم نگارشی (Accent Sensitivity – AI/AS)
این ویژگی به SQL Server میگوید که آیا کاراکترها با علائم نگارشی (مانند `é`, `è`, `ê`) با نسخههای بدون علامت آنها یکسان هستند یا خیر.
- AI (Accent-Insensitive): “résumé” و “resume” یکسان در نظر گرفته میشوند.
- AS (Accent-Sensitive): “résumé” و “resume” متفاوت در نظر گرفته میشوند.
مثال برای مقایسه با Collation حساس به علائم نگارشی (AS):
SELECT 'e' COLLATE Latin1_General_CS_AS = 'é' COLLATE Latin1_General_CS_AS;
-- نتیجه: 0 (False)
حساسیت به پهنا (Width Sensitivity – WI/WS)
این ویژگی مربوط به کاراکترهای ژاپنی و برخی زبانهای آسیای شرقی است که میتوانند به صورت نیمعرض (Half-width) یا تمامعرض (Full-width) نمایش داده شوند.
- WI (Width-Insensitive): “ア” (نیمعرض) و “ア” (تمامعرض) یکسان در نظر گرفته میشوند.
- WS (Width-Sensitive): “ア” و “ア” متفاوت در نظر گرفته میشوند.
حساسیت به کانا (Kana Sensitivity – KI/KS)
این ویژگی به تفاوت بین هیراگانا و کاتاکانا (دو سیستم نوشتاری ژاپنی) مربوط میشود.
- KI (Kana-Insensitive): کاراکترهای هیراگانا و کاتاکانا که دارای صدای یکسان هستند (مانند “か” و “カ”)، یکسان در نظر گرفته میشوند.
- KS (Kana-Sensitive): این کاراکترها متفاوت در نظر گرفته میشوند.
فرمتهای تاریخ و زمان (Date and Time Formats)
نحوه نمایش تاریخ و زمان بسته به منطقه متفاوت است. SQL Server ابزارهایی برای مدیریت این تفاوتها فراهم میکند. برای مثال، برای تبدیل تاریخ به فرمتهای مختلف منطقهای، میتوانید از تابع CONVERT با Style Codeهای مشخص استفاده کنید:
-- فرمت تاریخ ایالات متحده (MM/DD/YYYY)
SELECT CONVERT(VARCHAR, GETDATE(), 101);
-- فرمت تاریخ بریتانیا (DD/MM/YYYY)
SELECT CONVERT(VARCHAR, GETDATE(), 103);
یا از تابع FORMAT که از .NET Framework نشأت میگیرد، میتوانید استفاده کنید. این تابع برای کنترل دقیقتر فرمتهای منطقهای بسیار قدرتمند است:
-- فرمت تاریخ برای آلمان (DD.MM.YYYY)
SELECT FORMAT(GETDATE(), 'd', 'de-DE');
-- فرمت تاریخ و زمان برای ژاپن
SELECT FORMAT(GETDATE(), 'G', 'ja-JP');
فرمتهای واحد پول (Currency Formats)
نمایش واحد پول نیز از منطقهای به منطقه دیگر متفاوت است (مثلاً نماد واحد پول، محل قرارگیری آن، جداکننده اعشار و گروهبندی ارقام).
هنگام استفاده از نوع داده MONEY، SQL Server آن را با استفاده از تنظیمات منطقهای پیشفرض سرور (یا کاربر) نمایش میدهد.
SELECT CAST(12345.67 AS MONEY);
-- نتیجه ممکن است بسته به تنظیمات منطقهای سرور، '$12,345.67' یا '12.345,67 €' باشد.
برای کنترل دقیقتر، تابع FORMAT بسیار مفید است:
-- فرمت واحد پول برای ایالات متحده
SELECT FORMAT(12345.67, 'C', 'en-US');
-- نتیجه: $12,345.67
-- فرمت واحد پول برای آلمان
SELECT FORMAT(12345.67, 'C', 'de-DE');
-- نتیجه: 12.345,67 €
فرمتهای عددی (Number Formats)
جداکنندههای اعشار و گروهبندی ارقام (هزارگان) نیز از منطقهای به منطقه دیگر تفاوت دارند.
-- فرمت عددی برای ایالات متحده (جداکننده اعشار: نقطه، جداکننده هزارگان: کاما)
SELECT FORMAT(1234567.89, 'N', 'en-US');
-- نتیجه: 1,234,567.89
-- فرمت عددی برای فرانسه (جداکننده اعشار: کاما، جداکننده هزارگان: فاصله)
SELECT FORMAT(1234567.89, 'N', 'fr-FR');
-- نتیجه: 1 234 567,89
مرتبسازی و مقایسه (Sorting and Comparison)
Collation انتخاب شده بر نحوه مرتبسازی دادهها با ORDER BY و همچنین نتایج عملگرهای مقایسهای (مانند =، <، >) تأثیر میگذارد.
-- مثالی از مرتبسازی با یک Collation خاص
SELECT ProductName FROM Products
ORDER BY ProductName COLLATE Latin1_General_CI_AS;
ملاحظات جهانیسازی در SQL Server
Collation را میتوان در چهار سطح مختلف در SQL Server تنظیم کرد که هر سطح بر سطوح پایینتر از خود تأثیر میگذارد، مگر اینکه صراحتاً تغییر داده شود:
- Collation سرور (Server Collation): در زمان نصب SQL Server تنظیم میشود و Collation پیشفرض برای تمام پایگاههای داده سیستمی و کاربر جدید است.
- Collation پایگاه داده (Database Collation): هنگام ایجاد یک پایگاه داده جدید تنظیم میشود و Collation پیشفرض برای تمام ستونهای کاراکتری در آن پایگاه داده خواهد بود.
- Collation ستون (Column Collation): میتوان آن را برای ستونهای خاصی در یک جدول تنظیم کرد که Collation پیشفرض پایگاه داده را لغو میکند.
- Collation عبارت (Expression Collation): با استفاده از عبارت
COLLATEدر یک کوئری، میتوان Collation را برای یک عبارت خاص در زمان اجرا تغییر داد.
تنظیم Collation سرور
این تنظیم در طول نصب SQL Server انجام میشود و پس از آن تغییر آن پیچیده است و معمولاً نیاز به بازسازی کل سرور دارد. برای بررسی Collation فعلی سرور:
SELECT SERVERPROPERTY('Collation');
تنظیم Collation پایگاه داده
هنگام ایجاد یک پایگاه داده جدید، میتوانید Collation آن را مشخص کنید. اگر مشخص نشود، Collation پیشفرض سرور را به ارث میبرد.
CREATE DATABASE MyGlobalizationDB
COLLATE Latin1_General_100_CI_AS;
برای تغییر Collation یک پایگاه داده موجود:
ALTER DATABASE MyGlobalizationDB
COLLATE Latin1_General_100_CI_AS;
برای بررسی Collation یک پایگاه داده:
SELECT DATABASEPROPERTYEX('MyGlobalizationDB', 'Collation');
تنظیم Collation ستون
شما میتوانید Collation یک ستون خاص را در زمان ایجاد جدول یا تغییر آن مشخص کنید:
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName NVARCHAR(100) COLLATE French_CI_AS
);
برای تغییر Collation یک ستون موجود:
ALTER TABLE Products
ALTER COLUMN ProductName NVARCHAR(100) COLLATE French_CI_AS;
تنظیم Collation عبارت (Expression Collation)
در یک کوئری، میتوانید از بند COLLATE برای اعمال یک Collation خاص به یک عبارت یا ستون استفاده کنید، بدون اینکه Collation اصلی ستون را تغییر دهید. این کار برای مقایسهها یا مرتبسازیهای موقت مفید است.
SELECT * FROM Customers
WHERE CustomerName = 'john' COLLATE SQL_Latin1_General_CP1_CS_AS;
بهترین شیوهها برای جهانیسازی
- همیشه از NVARCHAR استفاده کنید: برای ذخیره هرگونه داده متنی که ممکن است شامل کاراکترهای چندزبانه باشد، از
NVARCHAR(وNCHAR) استفاده کنید. این کار تضمین میکند که تمامی کاراکترها به درستی ذخیره و بازیابی میشوند. - Collationها را درک کنید و سازگار باشید: Collation مناسب را در سطح پایگاه داده یا ستون انتخاب کنید و از تأثیر آن بر مرتبسازی و مقایسه آگاه باشید. تا حد امکان، از Collationهای سازگار در سراسر سیستم خود استفاده کنید.
- از FORMAT برای نمایش داده استفاده کنید: برای نمایش تاریخ، زمان، اعداد و واحد پول به کاربران، به جای وابستگی به تنظیمات پیشفرض سرور، از تابع
FORMATاستفاده کنید و Culture Code مناسب را ارائه دهید. - دادههای منطقهای را جدا کنید: اگر نیاز به ذخیره اطلاعات خاص منطقهای (مانند فرمتهای آدرس، کد پستی) دارید، آنها را در ستونها یا جداول جداگانه مدیریت کنید.
- آزمایش کامل: برنامههای خود را با دادههای متنوع و تنظیمات منطقهای مختلف به طور کامل آزمایش کنید تا از عملکرد صحیح جهانیسازی اطمینان حاصل شود.
خلاصه
جهانیسازی در SQL Server یک جنبه حیاتی برای توسعه برنامههای کاربردی مدرن است که با مخاطبان جهانی سروکار دارند. با درک دقیق مجموعههای کاراکتر، Collationها و نحوه مدیریت فرمتهای منطقهای، میتوانید پایگاه دادهای قوی و انعطافپذیر طراحی کنید که تجربه کاربری یکپارچهای را برای همه کاربران، فارغ از زبان و منطقه آنها، فراهم کند. به یاد داشته باشید که برنامهریزی و پیادهسازی صحیح جهانیسازی از ابتدا، میتواند از مشکلات بزرگ در آینده جلوگیری کند.