O'zgarmas uzunlikdagi belgilar turi
Kirish: Ushbu qo'llanmada siz PostgreSQL CHAR ma'lumot turi yordamida ma'lumotlar bazasida qat'iy (o'zgarmas) uzunlikdagi satrlarni saqlashni o'rganasiz.
PostgreSQLda CHARACTER nomi bilan ham tanilgan CHAR turi qat'iy belgilangan uzunlikdagi va bo'shliqlar (probellar) bilan to'ldiriladigan belgilar turidir.
CHAR turidagi ustunni e'lon qilish sintaksisi quyidagicha:
column_name CHAR(n)
Ushbu sintaksisda column_name ustuni aynan n ta belgidan iborat satrni saqlaydi.
Agar siz kiritgan satr uzunligi n dan kam bo'lsa, PostgreSQL talab qilingan uzunlikka yetkazish uchun uning oxiriga bo'shliqlar (probellar) qo'shib to'ldiradi (blank-padded).
Masalan, agar ustun CHAR(5) bo'lsa va siz unga ikki belgili 'hi' satrini kiritsangiz, PostgreSQL uni 5 belgiga yetkazish uchun 3 ta bo'shliq qo'shib saqlaydi ('hi ').
Agar belgilangan uzunlikdan ortiqroq satr kiritishga yoki yangilashga urinsangiz, PostgreSQL xatolik qaytaradi. Shu sababli, CHAR ustunidagi belgilar soni ma'lumotlar butunligini ta'minlash uchun qat'iy qoida vazifasini ham o'taydi.
Amaliyotda matnli satrlarni saqlash uchun ko'pincha CHAR o'rniga o'zgaruvchan uzunlikdagi VARCHAR (CHARACTER VARYING) turidan foydalaniladi.
Birinchidan, products nomli yangi jadval yaratamiz:
CREATE TABLE products (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR NOT NULL,
upc CHAR(12) NOT NULL
);
Ushbu jadvaldagi upc (universal tovar kodi) ustuni CHAR(12) turiga ega bo'lib, aynan 12 ta belgidan iborat kodni saqlashga mo'ljallangan.
Ikkinchidan, products jadvaliga qatorlar qo'shamiz:
INSERT INTO
products (name, upc)
VALUES
('iPhone 16 Pro', '194252714096'),
('iPhone 16 Pro Max', '194252697559')
RETURNING *;
Natija:
id | name | upc
----+-------------------+--------------
1 | iPhone 16 Pro | 194252714096
2 | iPhone 16 Pro Max | 194252697559
Uchinchidan, 12 belgidan kam bo'lgan UPC kodlarini kiritib ko'ramiz:
INSERT INTO
products (name, upc)
VALUES
('iPhone 17 Pro', '194252714'),
('iPhone 17 Pro Max', '194252697')
RETURNING *;
Natija:
id | name | upc
----+-------------------+--------------
3 | iPhone 17 Pro | 194252714
4 | iPhone 17 Pro Max | 194252697
PostgreSQL ushbu qiymatlarni 12 belgiga yetkazish uchun oxiriga bo'sh joylar qo'shadi.
Shuni yodda tutingki, agar length() funksiyasidan foydalansangiz, PostgreSQL belgilar sonini qaytarishdan oldin oxiridagi bo'shliqlarni olib tashlaydi:
SELECT
upc,
length(upc)
FROM
products;
Natija:
upc | length
--------------+--------
194252714096 | 12
194252697559 | 12
194252714 | 9
194252697 | 9
Xotirada saqlanayotgan haqiqiy baytlar hajmini ko'rish uchun octet_length() funksiyasidan foydalanishingiz mumkin:
SELECT
upc,
octet_length(upc)
FROM
products;
Natija:
upc | octet_length
--------------+--------------
194252714096 | 12
194252697559 | 12
194252714 | 12
194252697 | 12
Agar siz upc ustunida belgilar soni qat'iy 12 ta bo'lishini (kam ham, ko'p ham bo'lmasligini) talab qilmoqchi bo'lsangiz, CHECK cheklovidan foydalanishingiz mumkin.
To'rtinchidan, jadvalni CHECK (length(upc) = 12) cheklovi bilan qayta yaratamiz:
DROP TABLE products;
CREATE TABLE products (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR NOT NULL,
upc CHAR(12) NOT NULL CHECK (length(upc) = 12)
);
Endi 12 belgidan kam qiymat kiritishga uringanimizda, PostgreSQL xatolik chiqaradi:
INSERT INTO
products (name, upc)
VALUES
('iPhone 17 Pro Max', '194252697');
Xato xabari:
ERROR: new row for relation "products" violates check constraint "products_upc_check"
CHAR(n) yoki CHARACTER(n) qat'iy belgilangan uzunlikdagi satrlarni saqlaydi va qisqa satrlarni bo'shliqlar bilan to'ldiradi.length() funksiyasi bo'shliqlarsiz belgilar sonini, octet_length() esa xotiradagi haqiqiy hajm (baytlar) sonini qaytaradi.