سؤال

أحاول تحسين طاولات Postgresql 8.3 DB على أفضل ما لدي، وأنا غير متأكد إذا كنت بحاجة إلى استخدام varchar_pattern_ops لأعمدة معينة حيث أدفع LIKE ضد شخصيات N الأولى من سلسلة. وفق هذه الوثائق, ، استخدام xxx_pattern_ops ضروري فقط "... عندما لا يستخدم الخادم موضع المعيار" C "".

يمكن للشخص أن يفسر ما يعنيه هذا؟ كيف يمكنني التحقق من لغة قاعدة البيانات الخاصة بي تستخدم؟

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

المحلول

حاليا بعض الإعداداتمستنداتلا يمكن ضبط الدعم إلا في وقت INTDB، لكنني أعتقد أن الواحدة ذات الصلة _pattern_ops يمكن تعديلها عبر تعيين في وقت التشغيل، LC_Collate. لرؤية قيم المجموعة التي يمكنك استخدامها يعرض أمر.

علي سبيل المثال:

SHOW LC_COLLATE

_pattern_ops الفهارس مفيدة في الأعمدة التي تستخدم بنيات مطابقة النمط، مثل LIKE أو regexps. لا يزال يتعين عليك تقديم مؤشر منتظم (بدون _pattern_ops) للقيام بالمساواة في البحث عن مؤشر. لذلك عليك أن تأخذ كل هذا في الاعتبار لمعرفة ما إذا كنت بحاجة إلى هذه الفهارس على جداولك.

عن ما لغة هو، إنها مجموعة من القواعد حول طلب الشخصية والتنسيق وأشياء مماثلة تختلف من اللغة / البلد إلى لغة / بلد آخر. على سبيل المثال، قد يكون لدى Locale FR_CA (الفرنسية في كندا) بعض قواعد الفرز المختلفة (أو طريقة عرض الأرقام وما إلى ذلك) من EN_CA (الإنجليزية في كندا.). LOKALE "C" القياسية هي الإعداد الافتراضي لمواقع POSIX المتوافقة مع المعايير. فقط أحرف ASCII الصارمة صالحة، وقواعد الطلب والتنسيق هي في الغالب من en_us (الإنجليزية الأمريكية)

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

نصائح أخرى

PSQL -L.

وفقا لكتيب الكتيب

مثال الإخراج:

                               List of databases
    Name     | Owner  | Encoding |   Collate   |    Ctype    | Access privileges
-------------+--------+----------+-------------+-------------+-------------------
 packrd      | packrd | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres    | packrd | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0   | packrd | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/packrd        +
             |        |          |             |             | packrd=CTc/packrd
 template1   | packrd | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/packrd        +
             |        |          |             |             | packrd=CTc/packrd
(5 rows)

هناك أيضا طريقة أخرى (على افتراض أنك تريد التحقق منها، وليس تعديلها):

تحقق ملف /var/lib/postgres/data/postgresql.conf يجب العثور على الأسطر التالية:

# These settings are initialized by initdb, but they can be changed.
lc_messages = 'en_US.UTF-8'                     # locale for system error message strings
lc_monetary = 'en_US.UTF-8'                     # locale for monetary formatting
lc_numeric = 'en_US.UTF-8'                      # locale for number formatting
lc_time = 'en_US.UTF-8'                         # locale for time formatting

حسنا، من اطلاع بي، يبدو أن هذا الإعداد الأولي

initdb --locale=xxx

 --locale=locale
       Specifies the locale to be used in this database. This is equivalent to specifying both --lc-collate and --lc-ctype.

يحدد أساسا لغة "الافتراضي" لجميع البيانات التي تنشئها بعد ذلك (أي تحديد إعدادات Template1، وهو القالب الافتراضي). يمكنك إنشاء قواعد بيانات جديدة مع لغة مختلفة مثل هذا:

لغة مختلفة عن الترميز، يمكنك يدويا حدد و / أو الترميز:

 CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;

إذا كنت ترغب في الاتصال به يدويا.

أساسا إذا كنت لا تحددها، فإنه يستخدم الافتراضي للنظام، وهو ما لا يكاد يكون "C".

لذلك إذا كان لديك show LC_COLLATE إرجاع أي شيء آخر غير "C" أو "posix"، فأنت لا تستخدم standard C locale وستحتاج إلى تحديد xxx_pattern_ops للفهرست الخاص بك. لاحظ أيضا مذكرة قانونية أنه إذا كنت ترغب في استخدام <، <=،>>، أو> = المشغلون الذين تحتاجهم لإنشاء فهرس ثان دون علم XXX_Pattern_ops (ما لم تكن تستخدم لغة C قياسية C في قاعدة البيانات الخاصة بك، وهو أمر نادر ...). فقط == و LIKE (إلخ) ثم لا تحتاج إلى فهرس ثان. إذا كنت لا تحتاج LIKE ثم لا تحتاج إلى الفهرس باستخدام xxx_pattern_ops، ربما كذلك.

حتى لو تم تعريف الفهارس الخاصة بك إلى COLLATE مع "الافتراضي" مثل

CREATE INDEX my_index_name
  ON table_name
  USING btree
  (identifier COLLATE pg_catalog."default");

هذا ليس كافيا، ما لم يكن الافتراضي هو "C" (أو posix، نفس الشيء)، لا يمكن استخدامها لأنماط مثل LIKE 'ABC%'. وبعد تحتاج إلى شيء مثل هذا:

CREATE INDEX my_index_name
  ON table_name
  USING btree
  (identifier COLLATE pg_catalog."default" varchar_pattern_ops);

إذا كنت قد حصلت على الخيار ...

يمكنك إعادة إنشاء كتلة قاعدة البيانات مع لغة C.

تحتاج إلى اجتياز اللغة إلى initdb. متي جار تهيئة مثيل postgres الخاص بك.

يمكنك القيام بذلك بغض النظر عما هو لغة الخادم الافتراضية أو User's Locale.

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

يقوم بإنشاء كتلة جديدة تماما، ولا يقوم بترحيل أي من قواعد بيانات أو بياناتك الحالية. سيكون ذلك عمل إضافي.

علاوة على ذلك، إذا كنت في موقع يمكن أن تفكر فيه إنشاء كتلة جديدة كخيار، فعليك أن تفكر في استخدام postgresql 8.4 بدلا من ذلك، والتي يمكن أن يكون لها اللغات في قواعد البيانات, ، المحدد في إنشاء بيان قاعدة البيانات.

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