سؤال

في أوراكل ما الفرق بين:

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 BYTE),
 ID_CLIENT NUMBER
)

و

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11)
 ID_CLIENT NUMBER
)
هل كانت مفيدة؟

المحلول

لنفترض أن مجموعة أحرف قاعدة البيانات هي UTF-8، وهو الإعداد الموصى به في الإصدارات الأخيرة من Oracle.في هذه الحالة، تستغرق بعض الأحرف أكثر من بايت واحد لتخزينها في قاعدة البيانات.

إذا قمت بتعريف الحقل كـ VARCHAR2(11 BYTE), ، يمكن أن تستخدم Oracle ما يصل إلى 11 بايت للتخزين، ولكن قد لا تتمكن فعليًا من تخزين 11 حرفًا في الحقل، لأن بعضها يستغرق أكثر من بايت واحد للتخزين، على سبيل المثال.أحرف غير الإنجليزية.

من خلال تحديد المجال كما VARCHAR2(11 CHAR) تخبر Oracle أنها يمكنها استخدام مساحة كافية لتخزين 11 حرفًا، بغض النظر عن عدد البايتات اللازمة لتخزين كل حرف.قد يتطلب حرف واحد ما يصل إلى 4 بايت.

نصائح أخرى

يحتوي أحدهما على مساحة 11 بايت بالضبط، والآخر يتسع لـ 11 حرفًا بالضبط.قد تستخدم بعض مجموعات الأحرف مثل متغيرات Unicode أكثر من بايت واحد لكل حرف، وبالتالي قد يحتوي الحقل المكون من 11 بايت على مساحة أقل من 11 حرفًا اعتمادًا على التشفير.

أنظر أيضا http://www.joelonsoftware.com/articles/Unicode.html

اعتمادًا على تكوين النظام، يمكن أن يختلف حجم CHAR المقاس بـ BYTES.في الأمثلة الخاصة بك:

  1. حدود الحقل إلى 11 بايت
  2. حدود الحقل إلى 11 شارالجهات الفاعلة


خاتمة:1 CHAR لا يساوي 1 بايت.

لست متأكدًا لأنني لست من مستخدمي Oracle، لكنني أفترض أن الاختلاف يكمن عند استخدام مجموعات أحرف متعددة البايت مثل Unicode (UTF-16/32).في هذه الحالة، يمكن أن يمثل 11 بايت أقل من 11 حرفًا.

قد يتم أيضًا التعامل مع أنواع الحقول هذه بشكل مختلف فيما يتعلق بالأحرف المحركة أو الحالة، على سبيل المثال لن يتطابق 'binaryField(ete) = "été"' بينما قد لا يتطابق 'charField(ete) = "été"' (مرة أخرى لست متأكدًا من Oracle) .

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