چرا و چه موقع از پیشوند SQL ‘N’ در SQL Server (و به طور کلی) استفاده کنیم؟ – وبلاگ کالویان درنسکی

سلام ، من مدتی است که وبلاگ ننوشته ام ، بنابراین این یکی کوتاه خواهد بود.

بنابراین ، پیشوند N چیست و چرا و چه زمانی باید از آن استفاده کنید؟ پیشوند اساساً به SQL Server می گوید که کاراکترهای پس از پیشوند N را به عنوان یونیکد در نظر بگیرد.

به عنوان مثال ، فرض کنید ما این جدول پایگاه داده فوق اساسی را داریم ، به نام کاربران :

همه ستون ها عبارتند از: خود توضیحی توجه داشته باشید که همه ستون ها ، به جز نام کاربری ، از نوع داده nvarchar هستند. به زبان ساده ، نوع داده nvarchar تقریباً همه زبانهای موجود را پشتیبانی می کند.

به عنوان مثال ، اگر جان دو از ایالات متحده می خواهد یک حساب کاربری ایجاد کند ، می تواند از نام و نام خانوادگی خود استفاده کند که با الفبای خود (لاتین) نوشته شده است ، و در پایگاه داده نام اول جان خواهد بود. و نام خانوادگی Doe .

این نیز صادق است اگر یک پسر ژاپنی وجود دارد که می خواهد بدون هیچ مشکلی با استفاده از الفبای ژاپنی ثبت نام کند.

بنابراین ، به طور خلاصه ، اگر می خواهید برنامه شما از چندین زبان پشتیبانی کند ، حتماً از انواع داده NVARCHAR و NCHAR برای ستون های مناسب استفاده کنید.

توجه داشته باشید که ما از VARCHAR برای ستون نام کاربری استفاده کردیم ، زیرا من فرض می کنم که نام کاربری همیشه به لاتین باشد و از آنجا که VARCHAR همچنین فضای کمتری نسبت به NVARCHAR (1 بایت در مقابل بین 2 تا 4 بایت در هر کاراکتر) می گیرد ، ممکن است بهتر باش.

بنابراین ، بیایید به پیشوند N برگردیم و ببینیم که چرا به آن نیاز داریم و چه مشکلاتی را با چند مثال کوتاه حل می کند. به جدول کاربران.

   INSERT INTO [dbo]. [Users]
  ارزشها ('Username'، 'FirstName'، 'LastName'، 'About')

به منظور مثال ما دو نفر داریم – جان دو از ایالات متحده و آیکو از ژاپن که قصد ایجاد حساب دارند. در اینجا پرسش های هر دوی آنها و نتایج آن در جدول آمده است.

  1. جان دو ، ایالات متحده
  INSERT INTO [dbo]. [Users]
 ارزشها ('johndoe'، 'John'، 'Doe'، 'Hi، I'm John!')؛

2. آیکو (愛 子) ، ژاپن

  INSERT INTO [FacebookDB]. [dbo]. [Users]
 ارزشها ('aiko'، '愛 子'، '佐藤'، '井 の 中 の 蛙 を 知 ら))))))))))))))))) ず ず))))))))))) ؛

بنابراین ، برای جان دو همه چیز همانطور که انتظار می رفت کار کرد ، اما آیکو بسیار دیوانه خواهد بود زیرا نام و نام خانوادگی او و بخش مربوطه با "؟" جایگزین شده است. چه چیزی باعث این رفتار حشره دار شده است؟

بیایید ابتدا ببینیم ، به عبارت بسیار ساده ، SQL Server وقتی شروع به پردازش پرس و جو با نویسه های ژاپنی در آن می کند ، چه می کند.

هنگامی که SQL Server درخواست را مشاهده می کند از صفحه کد پیش فرض خود استفاده می کند ، که در مورد ما Cyrillic_General_CI_AS است ، برای تبدیل مقادیر ستون های داده شده.

به زبان ساده ، Cyrillic_General_CI_AS شامل تمام نویسه های لاتین و سیریلیک است. بنابراین برای نام کاربری ، از آنجا که به لاتین نوشته شده است ، مشکلی وجود ندارد و SQL Server می داند چگونه با آن رفتار کند. اما در سه ستون آخر (FirstName ، LastName و About) مشکلی وجود دارد. از آنجایی که صفحه کد پیش فرض SQL Server از این نویسه ها استفاده نمی کند/پشتیبانی نمی کند SQL Server به سادگی هر یک از کاراکترهای موجود را به "؟ " تبدیل کرده و آنها را در پایگاه داده قرار می دهد. به همین دلیل شما دو علامت سوال برای FirstName و LastName و 11 علامت سوال برای About دارید – بنابراین تصادفی نیست.

بنابراین چگونه می توانیم آن را برطرف کنیم؟ بیایید پیشوند N را نجات دهیم!

برای اینکه برنامه / پایگاه داده ما دارای پشتیبانی چند زبانه فعال باشد ، باید درخواست خود را کمی بازنویسی کرده و N را به عنوان پیشوند قبل از هر NVARCHAR (و اگر NCHAR داشتیم ، اضافه کنیم) ) ستون.

 INSERT INTO [dbo]. [Users]
ارزشها ('aiko'، N '愛 子'، N '佐藤'، N '井 の 中 蛙 大海 を 知 ら))))))))))))))))))))))))))))))))))))))))) ،)

و در اینجا نتیجه پرس و جو با پیشوند N در بالا آمده است:

بنابراین ، این پیشوند دقیقاً چه کاری انجام می دهد؟

وقتی SQL Server پیشوند N را می بیند ، می داند که کاراکترهای داخل نقل قول ها نویسه های یونیکد هستند (یعنی ممکن است لاتین ، چینی ، ژاپنی یا ترکیبی از این یا هر نویسه دیگری در آنجا وجود داشته باشد). حالا SQL Server از صفحه کد پیش فرض خود استفاده نمی کند (در مورد ما Cyrillic_General_CI_AS) اما در عوض کاراکترها را به یونیکد و سپس آنها را وارد می کند.

TL؛ DR

اگر می خواهید از چندین زبان پشتیبانی کنید ، مطمئن شوید که ستون های شما بسته به مورد NVARCHAR یا NCHAR هستند و همیشه پیشوند خود را پرسش هایی با N قبل از آن ستون ها ، مانند مثال بالا (و زیر).

 INSERT INTO [dbo]. [Users]
ارزشها ('aiko'، N '愛 子'، N '佐藤'، N '井 の 中 蛙 大海 を 知 ら))))))))))))))))))))))))))))))))))))))))) ،)

با تشکر از شما و کدگذاری مبارک!