ما هو الفرق بين شار nchar, varchar ، nvarchar في SQL Server?

StackOverflow https://stackoverflow.com/questions/176514

  •  05-07-2019
  •  | 
  •  

سؤال

ما هو المقصود من nvarchar?

ما هو الفرق بين char, nchar, varchar, ، nvarchar في SQL Server?

هل كانت مفيدة؟

المحلول

فقط لتوضيح...أو تلخيص...

  • nchar و nvarchar يمكن تخزين Unicode الأحرف.
  • char و varchar لا يمكن تخزين Unicode الأحرف.
  • char و nchar هي طول ثابت والتي سوف حجز مساحة التخزين على عدد من الشخصيات يمكنك تحديد حتى لو كنت لا تستخدم كل هذه المساحة.
  • varchar و nvarchar هي طول متغير والتي سيتم فقط استخدام مساحات الشخصيات المخزن.ذلك لن التخزين الاحتياطي مثل char أو nchar.

nchar و nvarchar سوف يستغرق ضعف الكثير من مساحة التخزين ، لذلك قد يكون من الحكمة أن استخدامها فقط إذا كنت بحاجة إلى Unicode الدعم.

نصائح أخرى

وجميع الإجابات حتى الآن تشير إلى أن varchar هو بايت واحد، nvarchar هو بايت مزدوج. الجزء الأول من هذا الواقع يعتمد على الترتيب كما هو موضح أدناه.

DECLARE @T TABLE
(
C1 VARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS,
C2 NVARCHAR(20)COLLATE  Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS
)

INSERT INTO @T 
    VALUES (N'中华人民共和国',N'中华人民共和国'),
           (N'abc',N'abc');

SELECT C1,
       C2,
       LEN(C1)        AS [LEN(C1)],
       DATALENGTH(C1) AS [DATALENGTH(C1)],
       LEN(C2)        AS [LEN(C2)],
       DATALENGTH(C2) AS [DATALENGTH(C2)]
FROM   @T  

عودة

لاحظ أن الأحرف و ما زالت غير ممثلة في النسخة VARCHAR واستبدلت بصمت مع ?.

وهي في الواقع لا يوجد حتى الآن الحروف الصينية التي يمكن reprsented من بايت واحد في هذا الترتيب. الأحرف بايت واحد فقط هي مجموعة ASCII الغربي نموذجي.

وبسبب هذا فمن الممكن لإدراج من عمود إلى عمود nvarchar(X) varchar(X) <لأ href = "https://dba.stackexchange.com/questions/123379/string-or-binary-data-would-be -truncated-خطأ النسخ-nvarchar10 إلى char10 / 123403 # 123403 "> فشل مع خطأ اقتطاع (حيث يدل X الرقم الذي هو نفسه في الحالتين).

وSQL خادم 2012 يضيف SC (الأحرف التكميلي) النسخ التي تدعم UTF-16. في هذه النسخ قد يستغرق والطابع nvarchar واحد أو 2 أو 4 بايت.

وNCHAR وشار الى حد كبير تعمل في بنفس الطريقة تماما كما كل منهما الآخر، كما تفعل NVARCHAR وVARCHAR. والفرق الوحيد بينهما هو أن NCHAR / NVARCHAR مخزن أحرف Unicode (ضروري إذا كنت تتطلب استخدام مجموعات الأحرف الموسعة)، في حين VARCHAR لا.

ولأن أحرف Unicode تحتاج إلى مزيد من التخزين، NCHAR / NVARCHAR الحقول يستغرق ضعفي مساحة (ذلك على سبيل المثال في الإصدارات السابقة من SQL Server الحد الأقصى لحجم حقل NVARCHAR 4000).

وهذا السؤال هو نسخة مكررة من هذا واحد .

فقط أن أضيف شيئا آخر:nchar - يضيف مسافات زائدة إلى البيانات.nvarchar - لا تضيف مسافات زائدة إلى البيانات.

لذا ، إذا كنت تنوي تصفية البيانات من قبل 'nchar' الميدان ، قد ترغب في استخدام وRTRIM لإزالة المساحات.E. g.nchar(10) حقل يسمى متاجر العلامة التجارية كلمة نايك.وتضيف 6 المساحات الصحيح للكلمة.لذا عندما تصفية التعبير كما يلي:وRTRIM(الحقول!العلامة التجارية.قيمة) = "نايك"

آمل أن يساعد هذا شخص هناك لأنني كنت تعاني قليلا فقط الآن!

محاولة تلخيص و الصحيح القائمة الإجابات:

أولا ، char و nchar دائما استخدام كمية محددة من مساحة التخزين ، حتى عندما السلسلة تخزين أصغر من المساحة المتاحة ، بينما varchar و nvarchar سوف تستخدم فقط الكثير من مساحة التخزين كما هو الحاجة إلى تخزين هذه السلسلة (زائد اثنين بايت من النفقات العامة ، ويفترض أن متجر طول السلسلة).لذا تذكر "فار" يعني "متغير" ، كما في متغير الفضاء.

النقطة الرئيسية الثانية أن نفهم ذلك ، nchar و nvarchar تخزين السلاسل باستخدام بالضبط اثنين بايت لكل حرف ، بينما char و varchar استخدام الترميز يحددها ترتيب صفحة التعليمات البرمجية التي سوف عادة يكون بالضبط بايت واحد لكل حرف (على الرغم من أن هناك استثناءات ، انظر أدناه).باستخدام اثنين بايت لكل حرف, مجموعة واسعة جدا من الشخصيات التي يمكن تخزينها ، لذلك الشيء الأساسي أن نتذكر هنا أن nchar و nvarchar تميل إلى أن تكون خيار أفضل بكثير عندما تريد دعم التدويل ، والتي ربما لا.

الآن بعض النقاط الدقيقة.

أولا ، nchar و nvarchar الأعمدة دائما تخزين البيانات باستخدام UCS-2.وهذا يعني أن اثنين بالضبط بايت لكل حرف سيتم استخدام أي حرف Unicode في الطائرة أساسية متعددة اللغات (BMP) يمكن تخزينها من قبل nchar أو nvarchar الحقل.ومع ذلك ، فإنه ليس حال أي حرف Unicode يمكن تخزينها.على سبيل المثال ، وفقا ويكيبيديا ، رمز نقطة المصرية الهيروغليفية تقع خارج BMP.ولذلك هناك سلاسل Unicode التي يمكن أن تكون ممثلة في UTF-8 وغيرها صحيح Unicode ترميزات التي لا يمكن تخزينها في SQL Server nchar أو nvarchar حقل سلاسل كتب في اللغة الهيروغليفية المصرية سيكون من بينها.لحسن الحظ الخاص بك المستخدمين ربما لا أكتب في هذا السيناريو, ولكن هذا شيء أن نأخذ في الاعتبار!

آخر مربكا ولكن نقطة مثيرة للاهتمام التي ملصقات أخرى أبرزت أن char و varchar مجالات استخدام اثنين بايت لكل حرف لبعض الشخصيات إذا جمع كود الصفحة يتطلب ذلك.(مارتن سميث يعطي مثالا ممتازا والذي يظهر كيف Chinese_Traditional_Stroke_Order_100_cs_as_ks_ws يسلك هذا السلوك.التحقق من ذلك.)

تحديث: كما من SQL Server 2012 ، وهناك أخيرا صفحات التعليمات البرمجية ل UTF-16, على سبيل المثال Latin1_General_100_CI_AS_SC التي حقا يمكن أن تغطي كامل Unicode مجموعة.

  • char:البيانات أحرف طول ثابت مع أقصى طول من 8000 حرف.
  • nchar:طول ثابت بيانات unicode مع أقصى طول من 4000 حرف.
  • Char = 8 بت طول
  • NChar = 16 بت طول

nchar[(n)] (شخصية وطنية)

  • طول ثابت Unicode سلسلة البيانات.
  • n يحدد طول السلسلة و يجب أن تكون قيمة من 1 إلى 4000.
  • حجم التخزين مرتين n بايت.

nvarchar [(n | max)] (الطابع الوطني متفاوتة.)

  • طول متغير Unicode سلسلة البيانات.
  • n يحدد طول السلسلة و تكون القيمة من 1 إلى 4000.
  • max يشير إلى أن الحد الأقصى لحجم التخزين 2^31-1 بايت (2 جيجا بايت).
  • حجم التخزين في البايت هو مرتين الفعلية طول البيانات المدخلة + 2 بايت

char [(n)] (حرف)

  • ذات طول ثابت ، non-Unicode سلسلة البيانات.
  • n يحدد طول السلسلة و يجب أن تكون قيمة من 1 إلى 8,000.
  • حجم التخزين هو n بايت.

varchar [(n | max)] (حرف متفاوتة)

  • متغير الطول ، Unicode سلسلة البيانات.
  • n يحدد طول السلسلة و تكون القيمة من 1 إلى 8,000.
  • max يشير إلى أن الحد الأقصى لحجم التخزين 2^31-1 بايت (2 جيجا بايت).
  • حجم التخزين الفعلي طول دخلت البيانات + 2 بايت.

الاختلافات هي:

  1. ن[فار]شار مخازن unicode حين [فار]شار فقط متجر بايت واحد الشخصيات.
  2. [ن]شار يتطلب عدد محدد من الشخصيات من الدقيق طول الوقت [ن]varchar يقبل متغير عدد من الشخصيات بما في ذلك المعرفة طول.

وثمة فرق آخر هو طول.كل nchar و nvarchar يمكن أن تصل إلى 4 ، 000 حرفا.و شار و varchar يمكن أن تصل إلى 8000 حرفا.ولكن ل SQL Server يمكنك أيضا استخدام [ن]varchar(max) التي يمكن التعامل مع ما يصل إلى 2,147,483,648 الشخصيات.(اثنين غيغابايت ، وقعت 4 بايت عدد صحيح.)

nchar يتطلب مساحة أكثر من nvarchar.

على سبيل المثال ،

شار(100) دائما تخزين 100 الشخصيات حتى لو كنت فقط أدخل 5 ، المتبقية 95 حرف سوف يكون مبطن مع المساحات.تخزين 5 شخصيات في varchar(100) سيوفر 5 أحرف.

وNCHAR (10) هي سلسلة Unicode ذات طول ثابت من طول 10. NVARCHAR (10) وسلسلة Unicode طول متغير بطول الحد الأقصى من 10. ويتم عادة استخدام السابق إذا كان كل قيم البيانات هي 10 حرفا وهذا الأخير إذا تتفاوت أطوال.

  • nchar هو طول ثابت و يمكن أن تعقد أحرف unicode.ويستخدم اثنين بايت تخزين لكل حرف.

  • varchar هو من طول متغير ولا يمكن عقد أحرف unicode.ويستخدم واحد بايت تخزين لكل حرف.

NVARCHAR يمكن تخزين أحرف Unicode ويأخذ 2 بايت لكل حرف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top