PostgreSQL-də mətnlə işləyəndə əsas 3 qəhrəmanımız var: CHAR, VARCHAR və TEXT. Bunların hərəsinin öz özəllikləri, üstünlükləri və incəlikləri var. Gəlin bir-bir baxaq.
CHAR(n)
CHAR, yəni character, sabit uzunluqlu n simvolluq sətirdir. Əgər daxil etdiyin sətir daha qısa olsa, avtomatik olaraq boşluqlarla tamamlanacaq.
Nümunə:
| id | kod - CHAR(5) |
|---|---|
| 1 | ''ABC'' |
Bu tip o zaman rahatdır ki, bütün sətirlər eyni uzunluqda olmalıdır (məsələn, kodlar, barkodlar və ya sabit uzunluqlu identifikatorlar).
Amma dəyişkən uzunluqlu mətnlə işləyəndə əlavə boşluqlar sadəcə bazada yer tutur.
VARCHAR(n)
VARCHAR, yəni variable character, maksimum n simvola qədər dəyişkən uzunluqlu sətirləri saxlamaq üçündür.
Nümunə:
| id | istifadəçi adı - VARCHAR(10) |
|---|---|
| 1 | ''Alice'' |
Bu tip yaddaşı effektiv istifadə edir, çünki yalnız real mətni saxlayır. Amma çatışmazlığı odur ki, uzunluq limiti göstərməlisən. Əgər sətir limiti aşarsa, baza error atacaq.
TEXT
TEXT — uzunluq limiti olmayan mətn tipidir. Əgər mətnin nə qədər böyüyəcəyini bilmirsənsə, bu tip çox istifadə olunur.
Nümunə:
| id | məzmun - TEXT |
|---|---|
| 1 | ''Bu çox uzun bir mətn parçasıdır. Limit yoxdur!'' |
Üstünlüklər: istənilən uzunluqda mətn saxlaya bilərsən, limit barədə düşünməyə ehtiyac yoxdur.
Çatışmazlıqlar: limit olmadığı üçün mətnlər "şişib" bazanı doldura bilər.
Mətn tiplərinin müqayisəsi
Mətnlə işləyəndə hansı tipin hansı vəziyyətə uyğun olduğunu başa düşmək vacibdir. Budur CHAR, VARCHAR və TEXT arasındakı əsas fərqlər:
| Verilənlər tipi | Uzunluq | Performans | Nə vaxt istifadə etməli? |
|---|---|---|---|
CHAR(n) |
Sabit | Sabit uzunluqlu sətirlər üçün daha sürətlidir | Sabit uzunluqlu kodlar üçün (məsələn, ISO) |
VARCHAR(n) |
Maksimum uzunluq n |
Uzunluq limiti varsa, TEXT-dən sürətlidir |
Maksimumu məlum olan dəyişkən uzunluqlu sətirlər üçün |
TEXT |
Limitsiz | Ən universal | Uzunluğu əvvəlcədən bilinməyən böyük mətnlər üçün |
Praktik istifadə nümunələri
Gəlin baxaq, bu tipləri real vəziyyətlərdə necə istifadə etmək olar.
Nümunə 1: Sabit uzunluqlu kodlar üçün CHAR istifadə etmək
Təsəvvür et, bir bazada şəhər kodlarını ISO 3166-1 alpha-3 standartına görə saxlamaq lazımdır. Hər kod dəqiq 3 simvol olmalıdır.
| city_id | city_name - VARCHAR(50) | iso_code - CHAR(3) |
|---|---|---|
| 1 | New York | NYC |
| 2 | Los Angeles | LAX |
| 3 | Chicago | CHI |
Burada CHAR(3) idealdır, çünki hər şəhərin ISO kodu sabit uzunluqludur.
Nümunə 2: İstifadəçi adları üçün VARCHAR istifadə etmək
İstifadəçi adı üçün VARCHAR əla seçimdir. Adlar adətən dəyişkən uzunluqlu olur, amma 50 simvolu keçməyəcəyini təxmin edə bilərik.
| user_id | istifadəçi adı - VARCHAR(50) | email - VARCHAR(50) |
|---|---|---|
| 1 | Alice | alice@example.com |
| 2 | Bob | bob@example.net |
Bu halda VARCHAR yaddaşa qənaət edir, çünki real sətir uzunluğu 50-dən az ola bilər.
Nümunə 3: Təsvirləri saxlamaq üçün TEXT istifadə etmək
Təsəvvür et, bir bloqun var və hər post üçün böyük mətn təsviri saxlamaq lazımdır. Burada ən yaxşı seçim TEXT-dir.
| post_id | başlıq - VARCHAR(100) | məzmun - TEXT |
|---|---|---|
| 1 | Post 1 | Bu çox uzun bir blog post məzmunudur və davam edir... |
Əgər mətnin uzunluğunu əvvəlcədən bilmirsənsə, TEXT tam yerinə düşür.
4. Əlavə incəliklər və tələlər
Mətn tipləri ilə işləyəndə bəzi məqamlar var ki, səhvlərdən qaçmaq üçün onları nəzərə almaq lazımdır.
Problem: CHAR boşluq əlavə edir
Əgər CHAR tipli sahədəki sətirləri əlavə boşluqları nəzərə almadan müqayisə etsən, gözlənilməz nəticələr ala bilərsən.
SELECT * FROM cities WHERE iso_code = 'NYC';
-- Heç nə qaytarmayacaq, əgər boşluqları silməsən
Necə düzəltmək olar: Boşluqları silmək üçün TRIM() funksiyasından istifadə et.
SELECT * FROM cities WHERE TRIM(iso_code) = 'NYC';
Problem: VARCHAR-da uzunluq limiti error verə bilər
Əgər VARCHAR tipli sahəyə limiti aşan sətir yazmağa çalışsan, baza error atacaq.
INSERT INTO users (username, email) VALUES ('A_username_that_is_too_long_for_field', 'test@example.com');
-- Error
Necə düzəltmək olar: Uzunluq limiti (n) real ehtiyaclara uyğun olmalıdır. Yaxud limit istəmirsənsə, TEXT istifadə et.
Problem: TEXT bazanı "şişirdə" bilər
TEXT limitsiz məlumat saxlayır, bu da cədvəllərin həddindən artıq böyüməsinə və indeksləşdirmənin çətinləşməsinə səbəb ola bilər.
Necə qaçmaq olar: Əgər TEXT tipli sütunu aktiv indeksləmək fikrin varsa, limitli VARCHAR istifadə etməyi düşün.
GO TO FULL VERSION