طريقة تخزين قصيرة سلاسل نصية في SQL Server قاعدة البيانات ؟

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

سؤال

varchar(255), varchar(256), nvarchar(255), nvarchar(256), nvarchar(max) ، وما إلى ذلك ؟

256 يبدو لطيفا, جولة, فعالة من حيث المساحة وعدد.ولكن رأيت 255 تستخدم الكثير.لماذا ؟

ما الفرق بين varchar و nvarchar?

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

المحلول

VARCHAR(255).وأنها لن تستخدم جميع 255 حرفا من تخزين فقط التخزين التي تحتاج إليها.إنه 255 و ليس 256 لأن ثم لديك مساحة 255 بالإضافة إلى null-منهي (أو حجم البايت).

"ن" لـ Unicode.استخدام إذا كنت تتوقع أحرف غير ASCII.

نصائح أخرى

في MS SQL Server (7.0 وما فوق) ، varchar يتم تمثيل بيانات داخليا مع ما يصل إلى ثلاث قيم:

  • الفعلية سلسلة من الأحرف التي سوف يكون من 0 إلى شيء أكثر من 8000 بايت (إنها مبنية على حجم الصفحة الأعمدة الأخرى المخزنة على التوالي ، وبعض العوامل الأخرى)
  • اثنين بايت يستخدم للإشارة إلى متى سلسلة البيانات (التي تنتج قيمة من 0 إلى 8000+)
  • إذا كان العمود nullable, بت واحد في الصف null بت (حتى null وضع ما يصل إلى ثمانية nullable الأعمدة يمكن أن تكون ممثلة في بايت واحد)

الجزء المهم هو أن اثنين بايت طول بيانات المؤشر.إذا كان بايت واحد, يمكنك بشكل صحيح فقط سجل سلاسل من طول 0 إلى 255;مع اثنين بايت, يمكنك تسجيل سلاسل من طول 0 إلى شيء أكثر من 64000+ (على وجه التحديد ، 2^16 -1).ومع ذلك, SQL Server طول الصفحة هو 8k حيث أن 8000+ حرف حد يأتي من.(هناك بيانات تجاوز الاشياء في SQL server 2005 ، ولكن إذا سلاسل الخاص بك سوف تكون طويلة يجب أن تذهب مع varchar(max).)

لذلك لا يهم كم كنت تقوم بتعريف نوع البيانات varchar العمود إلى (15, 127, 511) ، ما سوف يكون في الواقع تخزين لكل صف هو:

  • 2 بايت إلى بيان كيفية طويلة السلسلة
  • سلسلة الفعلي ، أيعدد من الشخصيات في هذه السلسلة

الذي يحصل لي أن وجهة نظري:عدد من الأنظمة القديمة تستخدم فقط 1 بايت لتخزين طول الوتر الذي محدودة إلى أقصى طول من 255 حرفا, وهي نسبة ليست طويلة.مع 2 بايت ، التعسفية الحد...لذا نوصي اختيار عدد من المنطقي أن (المفترضة غير موجهة من الناحية الفنية) المستخدم. أحب 50, 100, 250, 500 حتى 1000.بالنظر إلى أن قاعدة 8000+ بايت للتخزين, 255 أو 256 هو مجرد فعالة كما 200 أو 250 ، أقل فعالية عندما يحين الوقت لشرح الأمور إلى المستخدمين النهائيين.

وهذا ينطبق على بايت واحد من البيانات (أيansii SQL_Latin1*_*General_CP1, et.al.).إذا كان لديك لتخزين البيانات رمز متعددة الصفحات أو اللغات التي تستخدم الحروف الهجائية المختلفة, سوف تحتاج إلى العمل مع نوع البيانات nvarchar (الذي أعتقد أنه يعمل بنفس اثنين بايت عدد من charactesr ، ولكن الفعلي لكل حرف من البيانات يتطلب اثنين بايت من التخزين).إذا كان لديك سلاسل من المرجح أن تذهب أكثر من 8000 أو أكثر من 4000 في nvarchar, سوف تحتاج إلى استخدام [ن]varchar(max) أنواع البيانات.

و إذا كنت تريد أن تعرف السبب في أنه من المهم جدا أن تأخذ مساحة إضافية بايت فقط لتتبع كم البيانات ، والتحقق من http://www.joelonsoftware.com/articles/fog0000000319.html

فيليب

هناك عدة نقاط أخرى في الاعتبار عند تحديد شار/varchar و ن الاختلافات.

أولا هناك بعض النفقات إلى تخزين السلاسل ذات الطول المتغير في قاعدة البيانات.وهناك قاعدة عامة من الإبهام هو استخدام شار سلاسل أقل من 10 أحرف طويلة ، منذ N/VARCHAR مخازن كلا السلسلة و طول و الفرق بين تخزين قصيرة سلاسل في N/شار مقابلN/VARCHAR تحت 10 لا يستحق النفقات العامة من طول السلسلة.

الثانية, جدول في SQL server المخزنة على 8KB صفحات, لذلك ماكس حجم صف من البيانات 8060 بايت (الآخر 192 تستخدم لفوق SQL).هذا هو السبب في SQL يسمح ماكس تعريف عمود من VARCHAR(8000) و NVARCHAR(4000).الآن ، يمكن استخدام VARCHAR(MAX) و إصدار unicode.ولكن يمكن أن يكون هناك إضافية النفقات العامة المرتبطة بذلك.

إذا لم أكن مخطئا, SQL server محاولة لتخزين البيانات على نفس الصفحة مثل بقية الصف ولكن ، إذا كنت تحاول وضع الكثير من البيانات في VARCHAR(Max) عمود ، فإنه سيتم التعامل معها على أنها الثنائية وتخزينها على صفحة أخرى.

فرق كبير آخر بين شار و VARCHAR مع صفحة الانقسامات.نظرا لأن SQL Server بتخزين البيانات في 8KB صفحات, هل يمكن أن يكون أي عدد من الصفوف من البيانات المخزنة على الصفحة.إذا كنت التحديث VARCHAR عمود مع قيمة كبيرة بما فيه الكفاية أن الصف لم تعد تناسب على الصفحة خادم تقسيم تلك الصفحة ، نقل عن بعض عدد من السجلات.إذا كانت قاعدة البيانات قد لا يتوفر صفحات قاعدة البيانات هي مجموعة لصناعة السيارات في النمو ، فإن خادم الأولى تنمو قاعدة البيانات إلى تخصيص صفحات فارغة ، ثم تخصيص صفحات فارغة إلى طاولة وأخيرا تقسيم صفحة واحدة إلى اثنين.

إذا كنت سوف يكون دعم لغات أخرى غير اللغة الإنجليزية, سوف تحتاج إلى استخدام nvarchar.

HTML يجب أن تكون بخير طالما أنه يحتوي على أحرف ASCII القياسية.لقد استعملت nvarchar أساسا في قواعد البيانات التي تم دعم متعدد اللغات.

لأن هناك 8-بت في 1 بايت وذلك في 1 بايت يمكنك تخزين ما يصل إلى 256 متميزة القيم التي

0 1 2 3 4 5 ... 255

ملاحظة الرقم الأول هو 0 بحيث يصبح المجموع 256 الأرقام.

حتى إذا كنت تستخدم nvarchar(255) سوف تستخدم 1 بايت لتخزين طول السلسلة ولكن إذا كنت أكثر من طرف من 1 و استخدام nvarchar(256) ثم كنت إضاعة 1 أكثر بايت فقط إضافة 1 البند من 255 (منذ كنت في حاجة 2 بايت لتخزين رقم 256).

التي قد لا تكون التنفيذ الفعلي SQL server ولكن أعتقد أن هذا هو نموذجي المنطق للحد من الأشياء في أكثر من 255 256 البنود.

و nvarchar هو يونيكود ، استخدام 2 بايت لكل حرف ،
varchar هو عادي نص ASCII والتي تستخدم فقط 1 بايت

IIRC, 255 هو أقصى حجم varchar في الخلية قبل أن تتحول إلى نوع البيانات نص ، أو كان في بعض نقطة (في الواقع, أعتقد أنه أعلى الآن).حتى حفظ إلى 255 قد يشتري لك بعض التوافق هناك.أنت تريد أن ننظر إلى هذا الأمر قبل أن يتصرف على أنه ، على الرغم من.

varchar مقابل nvarchar كيندا مثل ascii مقابل unicode.varchar يقتصر على بايت واحد لكل حرف ، nvarchar يمكن استخدام اثنين.لهذا السبب يمكن أن يكون varchar(8000) ولكن فقط nvarchar(4000)

كل varchar و nvarchar السيارات-حجم المحتوى ، ولكن عدد تعرف عندما يعلن نوع العمود هو الحد الأقصى.

القيم في "nvarchar" يستغرق مرتين القرص/مساحة الذاكرة مثل "varchar" لأن unicode هو اثنين بايت, ولكن عندما تقوم بتعريف نوع العمود أنت إعلان عدد من الشخصيات ، ليس بايت.

حتى عندما يمكنك تحديد نوع العمود ، يجب تحديد الحد الأقصى لعدد الأحرف التي سوف العمود من أي وقت مضى في حاجة إلى الاستمرار ويكون ذلك كما varchar (أو nvarchar) حجم.

وهناك قاعدة جيدة من التجربة هو تقدير الحد الأقصى لسعة طول العمود يحتاج إلى عقد ، ثم إضافة دعم حوالي 10% من أكثر الشخصيات إلى ذلك لتجنب المشاكل مع طويلة بشكل غير متوقع البيانات في المستقبل.

varchar(255) أيضا أقصى طول في SQL Server 7.0 والإصدارات السابقة.

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