English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الفصل، سنناقش أنواع البيانات في PostgreSQL، حيث يتم تعيين نوع البيانات لكل حقل عند إنشاء جدول.
فوائد تعيين نوع البيانات:
يقدم PostgreSQL أنواعًا متنوعة من البيانات. يمكن للمستخدم استخدام الأمر CREATE TYPE لإنشاء أنواع جديدة في قاعدة البيانات. هناك العديد من أنواع البيانات في PostgreSQL، وسنوضح ذلك بشكل دقيق فيما يلي.
تتكون أنواع الأعداد من أعداد صحيحة بحجم 2 بايت أو 4 بايت أو 8 بايت وأعداد عشرية بحجم 4 بايت أو 8 بايت مع دقة اختيارية.
يوضح الجدول أدناه أنواع الأعداد المتاحة.
الاسم | طول التخزين | وصف | مجال |
---|---|---|---|
smallint | 2 بايت | عدد صغير في نطاق ضيق | -32768 إلى +32767 |
عددي | 4 بايت | الأعداد الصحيحة الشائعة | -2147483648 إلى +2147483647 |
bigint | 8 بايت | عدد كبير في نطاق واسع | -9223372036854775808 إلى +9223372036854775807 |
decimal | طول متغير | دقة محددة من قبل المستخدم، دقيقة | 131072 مكان قبل نقطة العشرية؛ 16383 مكان بعد نقطة العشرية |
numeric | طول متغير | دقة محددة من قبل المستخدم، دقيقة | 131072 مكان قبل نقطة العشرية؛ 16383 مكان بعد نقطة العشرية |
real | 4 بايت | دقة متغيرة، غير دقيقة | دقة عشرية 6 مرتبة |
double precision | 8 بايت | دقة متغيرة، غير دقيقة | دقة عشرية 15 مرتبة |
smallserial | 2 بايت | عدد صغير متناسب في نطاق ضيق | 1 إلى 32767 |
serial | 4 بايت | عدد صغير متناسب | 1 إلى 2147483647 |
bigserial | 8 بايت | عدد كبير متناسب في نطاق واسع | 1 إلى 9223372036854775807 |
يخزن نوع money مبلغ النقد المحدد بدقة صغيرة ثابتة.
يمكن تحويل قيم numeric و int و bigint إلى money، ويُنصح بعدم استخدام الأعداد العشرية للتعامل مع أنواع المال، لأن هناك احتمال لحدوث أخطاء في التسوية.
الاسم | الحجم التخزيني | وصف | مجال |
---|---|---|---|
money | 8 بايت | مبلغ نقدي | -92233720368547758.08 إلى +92233720368547758.07 |
يوضح الجدول أدناه أنواع الحروف المدعومة من PostgreSQL:
الرقم | الاسم & الوصف |
---|---|
1 | character varying(n), varchar(n) متغير الطول، مع حد للطول |
2 | character(n), char(n) مقاس ثابت، يتم补足不足的部分用空格 |
3 | text متغير الطول، بدون حد للطول |
يوضح الجدول أدناه أنواع التاريخ والوقت المدعومة من PostgreSQL.
الاسم | المساحة المخزنة | وصف | أدنى قيمة | أعلى قيمة | دقة |
---|---|---|---|---|---|
timestamp [ (p) ] [ بدون منطقة زمنية ] | 8 بايت | التاريخ والوقت (بدون منطقة زمنية) | 4713 ق | 294276 م | 1 ملي ثانية / 14 موقع |
timestamp [ (p) ] مع منطقة زمنية | 8 بايت | التاريخ والوقت، مع منطقة زمنية | 4713 ق | 294276 م | 1 ملي ثانية / 14 موقع |
التاريخ | 4 بايت | يستخدم فقط للأيام | 4713 ق | 5874897 م | 1 يوم |
وقت [ (p) ] [ بدون منطقة زمنية ] | 8 بايت | يستخدم فقط لوقت في اليوم الواحد | 00:00:00 | 24:00:00 | 1 ملي ثانية / 14 موقع |
وقت [ (p) ] مع منطقة زمنية | 12 بايت | يستخدم فقط لوقت في اليوم الواحد، مع منطقة زمنية | 00:00:00+1459 | 24:00:00-1459 | 1 ملي ثانية / 14 موقع |
فترة زمنية [ الحقول ] [ (p) ] | 12 بايت | فترة الزمنية | -178000000 سنة | 178000000 سنة | 1 ملي ثانية / 14 موقع |
يدعم PostgreSQL نوع البيانات boolean القياسي.
boolean لديه "true" (صحيح) أو "false" (خطأ) حالتان، والوضع الثالث "unknown" (غير معروف) الذي يتم تمثيله بـ NULL.
الاسم | تنسيق التخزين | وصف |
---|---|---|
boolean | 1 بايت | صحيح/خطأ |
أنواع المفردات هي نوع بيانات يحتوي على مجموعة مرتبة من القيم الثابتة.
أنواع المفردات في PostgreSQL تشبه أنواع المفردات في لغة البرمجة C.
على عكس الأنواع الأخرى، تحتاج أنواع المفردات إلى استخدام الأمر CREATE TYPE لإنشائها.
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
إنشاء أيام الأسبوع كما يلي:
CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
مثل الأنواع الأخرى، يمكن استخدام نوع المفردات بعد إنشائه في تعريف الجداول والوظائف.
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy'); CREATE TABLE person ( الاسم نص, current_mood الحالة ); INSERT INTO person VALUES ('Moe', 'happy'); SELECT * FROM person WHERE current_mood = 'happy'; الاسم | الحالة الحالية ------+-------------- Moe | سعيد (1 سطر)
أنواع البيانات الجغرافية تمثل الأجسام المسطحة في الثلاثة أبعاد.
الجدول أدناه يبين الأنواع الجغرافية التي يدعمها PostgreSQL.
أبسط أنواع: النقطة. إنها أساس الأنواع الأخرى.
الاسم | المساحة المخزنة | الشرح | طريقة التعبير |
---|---|---|---|
point | 16 بيت | نقطة في المستوى العرضي | (x,y) |
line | 32 بيت | الخط غير المحدود (لم يتم تنفيذه بشكل كامل) | ((x1,y1),(x2,y2)) |
lseg | 32 بيت | الخط المحدود | ((x1,y1),(x2,y2)) |
box | 32 بيت | مربع | ((x1,y1),(x2,y2)) |
path | 16+16n بيت | المسار المغلق (مثل المضلع) | ((x1,y1),...) |
path | 16+16n بيت | المسار المفتوح | [(x1,y1),...] |
polygon | 40+16n بيت | مضلع (مثل المسار المغلق) | ((x1,y1),...) |
circle | 24 بيت | الدائرة | <(x,y),r> (مركز وعرض) |
يقدم PostgreSQL أنواع بيانات لتحديد عناوين IPv4 وIPv6 وMAC.
تخزين عناوين الشبكة باستخدام هذه الأنواع البيانية أفضل من استخدام أنواع النصوص النقية، لأن هذه الأنواع توفر التحقق من صحة المدخلات وتقديم عمليات خاصة وفئات.
الاسم | المساحة المخزنة | وصف |
---|---|---|
cidr | 7 أو 19 بيت | شبكة IPv4 أو IPv6 |
inet | 7 أو 19 بيت | مزيج من أجهزة الحاسوب والشبكات IPv4 أو IPv6 |
macaddr | 6 بيت | عنوان MAC |
عند تصنيف بيانات نوع inet أو cidr، تكون عناوين IPv4 دائمًا في المقدمة من عناوين IPv6، بما في ذلك تلك المدمجة أو الم映射ة على عناوين IPv6، مثل ::10.2.3.4 أو ::ffff:10.4.3.2.
السلسلة الثنائية هي سلسلة من الأرقام 1 و0. يمكن استخدامها لتخزين وتوضيح وهموم البت.
بيانات نوع bit يجب أن تكون مطابقة للطول n، وال محاولة تخزين بيانات أقصر أو أطول هي خطأ. نوع البيانات bit varying هو نوع متغير الطول الأقصى n؛ سيتم رفض الأطوال الأطول. الكتابة بدون طول للـ bit هي bit(1)، والكتابة بدون طول للـ bit varying تعني عدم وجود حد للطول.
البحث الكامل النصي هو العثور على المستندات التي تتطابق مع الاستعلام من مجموعة مستندات باللغة الطبيعية.
يقدم PostgreSQL نوعين من أنواع البيانات لدعم البحث الكامل النصي:
الرقم | الاسم & الوصف |
---|---|
1 | tsvector قيمة tsvector هي قائمة مرتبة من التكرارات المختلفة من الكلمات، وهي معيارية لبعض الأنواع المختلفة من نفس الكلمة. |
2 | tsquery tsquery يحتوي على الكلمات الأساسية المستخدمة في البحث، ويستخدم أجهزة الاستدلال (AND)، (OR) و!(NOT) للدمجها، ويستخدم المثلثات للإشارة إلى مجموعات الأجهزة الاستدلالية. |
يستخدم نوع البيانات UUID لتخزين المعرّف الفريد الشامل (UUID) المحدد في RFC 4122، ISO/IEC 9834-8:2005 وأي معايير مرتبطة. (بعض النظم تعتبر هذا النوع من المعرّف الفريد الشامل أو GUID.). هذا المعرّف هو معرّف من 128 بت يتم إنشاؤه بواسطة خوارزمية، مما يجعله من المستحيل أن يكون مثل المعرّف الذي تم إنشاؤه بواسطة نفس الخوارزمية في مكونات أخرى. لذلك، بالنسبة للنظم الموزعة، يقدم هذا المعرّف ضمانًا أفضل للفريدية مقارنة بالسلاسل، لأن السلاسل يمكن أن تضمن الفريدية فقط داخل قاعدة البيانات الواحدة.
UUID يتم كتابته كسلسلة من الأرقام الستة عشر الصغيرة، مقسومة إلى عدة مجموعات، خاصةً مجموعة من 8 أرقام + ثلاث مجموعات من 4 أرقام + مجموعة من 12 أرقام، مما يعطي مجموع 32 رقمًا يمثل 128 بت، مثال على UUID المعياري كالتالي:
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
يمكن استخدام نوع البيانات xml لتحديد بيانات XML. الفوائد في تخزين بيانات XML في نوع النص هي أنه يمكن التحقق من جودة التركيب للقيم المدخلة، بالإضافة إلى دعم التحقق من نوعية الأمان للدوال. لتشغيل هذا النوع من البيانات، يجب استخدام configure --with-libxml عند التجميع.
يمكن لتخزين xml أن يحتوي على "مستند" صحيح من acordo مع o padrão XML، assim como aqueles definidos no padrão XML. XMLDecl? content الجزء المحدد "المحتوى"، بشكل عام، مما يعني أن جزء المحتوى يمكن أن يحتوي على عدة عناصر رئيسية أو عناصر نصية. يمكن استخدام التعبير xmlvalue IS DOCUMENT لتقييم ما إذا كانت قيمة xml معينة هي ملف كامل أو جزء محتوى.
استخدام الدالة xmlparse: لإنشاء قيمة xml من البيانات النصية:
XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></book>') XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')
نوع البيانات JSON يمكن استخدامه لتخزين بيانات JSON (JavaScript Object Notation)، ويمكن أيضًا تخزين هذه البيانات ك نص، ولكن نوع البيانات JSON أكثر فائدة في التحقق من أن كل قيمة مخزنة قابلة للاستخدام كقيمة JSON.
إضافة إلى ذلك، هناك وظائف مرتبطة لتعامل بيانات JSON:}
مثال | نتيجة مثال |
---|---|
array_to_json('{{1,5},{99,100}}'::int[]) | [[1,5],[99,100]] |
row_to_json(row(1,'foo')) | {"f1":1,"f2":"foo"} |
PostgreSQL يسمح بتعريف حقول مصفوفات متعددة الأبعاد.
يمكن أن تكون نوع اللائحة أي نوع أساسي أو نوع معرف مسبقًا، أو نوع معرف أو نوع معقد.
عند إنشاء الجدول، يمكننا إعلان اللائحة بالطريقة التالية:
CREATE TABLE sal_emp ( name text, pay_by_quarter عدد كامل[], جدول الزمني نص[][] );
pay_by_quarter هو مصفوفة عدد كامل أحادية الأبعاد، وschedule هو مصفوفة نصية ثنائية الأبعاد.
يمكننا أيضًا استخدام كلمة المفتاح "ARRAY"، مثلما هو موضح أدناه:
CREATE TABLE sal_emp ( الاسم نص, pay_by_quarter عدد كامل ARRAY[4], جدول الزمني نص[][] );
تستخدم القيم المدمجة في الدوائر المزدوجة {}، وتم فصل العناصر بالكومياء في {}:
INSERT INTO sal_emp VALUES ('Bill', '{10000, 10000, 10000, 10000}', '{{"meeting", "lunch"}, {"training", "presentation"}}'); INSERT INTO sal_emp VALUES ('Carol', '{20000, 25000, 25000, 25000}', '{{"breakfast", "consulting"}, {"meeting", "lunch"}}');
الآن يمكننا تشغيل بعض الاستعلامات على هذه الجدول.
أولاً، سنعرض كيفية الوصول إلى عنصر اللائحة. هذه الاستعلام تبحث عن أسماء الموظفين الذين تغيرت رواتبهم في الربع الثاني:
SELECT name FROM sal_emp WHERE pay_by_quarter[1] <> pay_by_quarter[2]; الاسم ------- Carol (1 سطر)
رقم مؤشر اللائحة مكتوب داخل الدوائر المزدوجة.
نحن يمكننا تعديل قيم اللائحة:
UPDATE sal_emp SET pay_by_quarter = '{25000,25000,27000,27000}' WHERE name = 'Carol';
或者使用 ARRAY 构造器语法:
UPDATE sal_emp SET pay_by_quarter = ARRAY[25000,25000,27000,27000] WHERE name = 'Carol';
要搜索一个数组中的数值,你必须检查该数组的每一个值。
比如:
SELECT * FROM sal_emp WHERE pay_by_quarter[1] = 10000 OR pay_by_quarter[2] = 10000 OR pay_by_quarter[3] = 10000 OR pay_by_quarter[4] = 10000;
另外,你可以用下面的语句找出数组中所有元素值都等于 10000 的行:
SELECT * FROM sal_emp WHERE 10000 = ALL (pay_by_quarter);
或者,可以使用 generate_subscripts 函数。例如:
SELECT * FROM (SELECT pay_by_quarter, generate_subscripts(pay_by_quarter, 1) AS s FROM sal_emp) AS foo WHERE pay_by_quarter[s] = 10000;
复合类型表示一行或者一条记录的结构; 它实际上只是一个字段名和它们的数据类型的列表。PostgreSQL 允许像简单数据类型那样使用复合类型。比如,一个表的某个字段可以声明为一个复合类型。
下面是两个定义复合类型的简单实例:
CREATE TYPE complex AS ( r double precision, i double precision ); CREATE TYPE inventory_item AS ( name text, supplier_id integer, price numeric );
语法类似于 CREATE TABLE,只是这里只可以声明字段名字和类型。
定义了类型,我们就可以用它创建表:
CREATE TABLE on_hand ( item inventory_item count integer ); INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);
لإدخال قيمة النوع المدمج كنص، يتم حشو القيم في الأقواس وتفصل بينها بالكومات. يمكنك وضع دوائر مزدوجة حول أي قيمة، إذا كانت تحتوي على كومات أو أقواس، يجب أن تُحشى بالدوائر المزدوجة.
يكون شكل قيمة النوع المدمج العامة كالتالي:
'(val1, val2, ...)'
مثالًا:
'("fuzzy dice",42,1.99)'
للوصول إلى مجال حقل نوع مدمج، نكتب نقطة ومجال الاسم، يشبه اختيار حقل من اسم الجدول. في الواقع، لأنه يشبه اختيار حقل من اسم الجدول جدًا، نحتاج عادة إلى استخدام الأقواس لتجنب التشويه من قبل المحلل. على سبيل المثال، قد تحتاج إلى اختيار بعض المجالات من جدول on_hand المدمج، مثلما يلي:
SELECT item.name FROM on_hand WHERE item.price > 9.99;
لن يعمل هذا، لأنه وفقًا لقواعد SQL، item يتم اختياره من اسم الجدول، وليس من اسم الحقل. يجب عليك كتابة مثلما يلي:
SELECT (item).name FROM on_hand WHERE (item).price > 9.99;
أو إذا كنت بحاجة أيضًا إلى استخدام اسم الجدول (مثل، في استعلام متعدد الجداول)، يمكنك كتابة:
SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;
الآن يتم تحليل الكيان المدمج في الأقواس بشكل صحيح كإشارة إلى حقل item، ثم يمكن اختيار المجالات منه.
نوع البيانات النطاق يمثل القيم في نطاق معين من نوع عنصر معين.
على سبيل المثال، قد يستخدم نطاق الزمن لت不代表 قاعة اجتماعات مخصصة لفترة معينة.
تضم PostgreSQL أنواع نطاقات مدمجة مثل:
int4range — مساحة integer
int8range — مساحة bigint
numrange — مساحة عددية
tsrange — الزمن بدون التوقيت المناطقي لمساحة الزمن
tstzrange — الزمن مع التوقيت المناطقي لمساحة الزمن
daterange — نطاق التاريخ
بالإضافة إلى ذلك، يمكنك تعريف نوع نطاق خاص بك.
CREATE TABLE reservation (room int, during tsrange); INSERT INTO reservation VALUES (1108, '[2010-01-01 14:30, 2010-01-01 15:30)'); -- يحتوي SELECT int4range(10, 20) @> 3; -- التداخل SELECT numrange(11.1, 22.2) && numrange(20.0, 30.0); -- استخراج الحد العلوي SELECT upper(int8range(15, 25)); -- حساب التداخل SELECT int4range(10, 20) * int4range(15, 25); -- ما إذا كان النطاق فارغًا SELECT isempty(numrange(1, 5));
يجب اتباع النمط التالي لإدخال قيم النطاق:
(الحد السفلي، الحد العلوي) (الحد السفلي، الحد العلوي] [الحد السفلي، الحد العلوي) [الحد السفلي، الحد العلوي] 空的
تظهر الأقواس العريضة أو المربعة الحدود السفلية والعلوية غير المضمونة أو المضمونة. يرجى ملاحظة أن النمط النهائي هو فارغ، مما يمثل نطاقًا فارغًا (نطاقًا لا يحتوي على قيم).
-- يشمل 3 ولا يشمل 7، ويشمل جميع النقاط بينهما SELECT '[3,7)'::int4range; -- لا يشمل 3 و7، ولكن يشمل جميع النقاط بينهما SELECT '(3,7)'::int4range; -- يشمل فقط القيمة 4 SELECT '[4,4]'::int4range; -- لا يشمل النقطة (تم استبدالها بـ '空的') SELECT '[4,4)'::int4range;
يستخدم PostgreSQL معرف العنصر (OID) كمفتاح رئيسي في مختلف جداول النظام.
في نفس الوقت، لن يضيف النظام حقل OID النظام إلى الجداول التي أنشأها المستخدم (ما لم يتم تضمين WITH OIDS أو إعداد المعلمة default_with_oids على التشغيل). يمثل نوع OID معرف عنصر. بالإضافة إلى ذلك، لدى OID عدة أسماء مستعارة: regproc، regprocedure، regoper، regoperator، regclass، regtype، regconfig، وregdictionary.
الاسم | مرجع | وصف | مثال عدد |
---|---|---|---|
oid | أي | معرف الكائن المُرقم | 564182 |
regproc | pg_proc | اسم الوظيفة | sum |
regprocedure | pg_proc | وظائف معادلة النوع | sum(int4) |
regoper | pg_operator | اسم العملي | + |
regoperator | pg_operator | عمليات معادلة النوع | (عددي،عددي) أو -(لا شيء،عددي) |
regclass | pg_class | اسم العلاقة | pg_type |
regtype | pg_type | اسم نوع البيانات | عددي |
regconfig | pg_ts_config | إعدادات البحث النصي | إنجليزي |
regdictionary | pg_ts_dict | قاموس البحث النصي | بسيط |
يحتوي نظام أنواع PostgreSQL على مجموعة من المدخلات الخاصة المستخدمة، وتُدعى هذه المدخلات أنواع مزيفة. لا يمكن استخدام أنواع المزيفة كنوع للحقول، ولكن يمكن استخدامها لتحديد نوع معاملات وظيفة أو ناتجها. تكون أنواع المزيفة مفيدة عندما لا تُقبل وظيفة ببساطة نوع بيانات SQL معين.
يُظهر الجدول أدناه جميع أنواع المزيفة:
الاسم | وصف |
---|---|
any | يعبر عن وظيفة تستقبل أي نوع بيانات إدخال. |
anyelement | يعبر عن وظيفة تستقبل أي نوع بيانات. |
anyarray | يعبر عن وظيفة تستقبل أي نوع مصفوفة. |
anynonarray | يعبر عن وظيفة تستقبل أي نوع غير مصفوفة. |
anyenum | يعبر عن وظيفة تستقبل أي نوع قائمة. |
anyrange | يعبر عن وظيفة تستقبل أي نوع بيانات. |
cstring | يعبر عن وظيفة تستقبل أو تعود سلسلة C مُنتهية بكارتر. |
داخلي | يعبر عن وظيفة تستقبل أو تعود نوع بيانات داخلي. |
language_handler | يُعلن عن معالج لغة عملية لتكون مُعادلة language_handler. |
fdw_handler | يُعلن عن وحدة بيانات خارجية لتكون مُعادلة fdw_handler. |
سجل | يُشير إلى وظيفة تعود بنوع سطر غير مُعلن. |
ترigger | يُعلن عن وظيفة الترigger. |
لا شيء | يعبر عن وظيفة لا تعود بمعدل. |
غير شفاف | نوع قديم، كان يستخدم لجميع هذه الاستخدامات السابقة. |