39 / 100

CHAR

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.

PostgreSQL CHAR ma'lumot turiga kirish

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:

query.sql
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.

PostgreSQL CHAR turiga misol

Birinchidan, products nomli yangi jadval yaratamiz:

query.sql
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:

query.sql
INSERT INTO
  products (name, upc)
VALUES
  ('iPhone 16 Pro', '194252714096'),
  ('iPhone 16 Pro Max', '194252697559') 
RETURNING *;

Natija:

matn
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:

query.sql
INSERT INTO
  products (name, upc)
VALUES
  ('iPhone 17 Pro', '194252714'),
  ('iPhone 17 Pro Max', '194252697') 
RETURNING *;

Natija:

matn
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:

query.sql
SELECT
  upc,
  length(upc)
FROM
  products;

Natija:

matn
     upc      | length
--------------+--------
 194252714096 |     12
 194252697559 |     12
 194252714    |      9
 194252697    |      9

Xotirada saqlanayotgan haqiqiy baytlar hajmini ko'rish uchun octet_length() funksiyasidan foydalanishingiz mumkin:

query.sql
SELECT
  upc,
  octet_length(upc)
FROM
  products;

Natija:

matn
     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:

query.sql
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:

query.sql
INSERT INTO
  products (name, upc)
VALUES
  ('iPhone 17 Pro Max', '194252697');

Xato xabari:

matn
ERROR: new row for relation "products" violates check constraint "products_upc_check"

Xulosa

  • 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.