எஸ்க்யூஎல் சர்வரில் char, varchar என்று இரண்டு வெவ்வேறு மாறிலி வகைகள், ஒரே நோக்கத்திற்காக இருக்கின்றன.
ஆரம்பக்கால தகவல்தள வடிவமைப்பாளருக்கு இவ்விரண்டில் சிறிய எழுத்துச் சரங்களை(small strings)த் தேக்கி வைக்க எதைத் தேர்ந்தெடுப்பது என்பதில் சில நேரங்களில் குழப்பம் வரலாம். பெரும்பாலும் varcharதான் தேர்ந்தெடுக்கப் படுகிறது. ஒப்பீட்டளவில், varcharன் பொருளான "மாற்றி அமைத்துக்கொள்ளும் மாறிலி வகை" (variable character) என்ற பண்பின் ஈர்ப்பு இதற்குக் காரணமாக இருக்கலாமோ என்று தோன்றுகிறது.
தத்தமது தகவலைச் சேமிக்கும் முறை மற்றும் வினவலுக்குத் தகவலைத் திரட்டி வழங்கும் முறைகளால் char மற்றும் varchar மாறிலிகள் வேறுபடுகின்றன. இவற்றுக்கு இடையேயான அடிப்படை வேற்றுமை என்று பார்த்தால், மிகவும் பிரசித்தமான, சரங்களைப் பதியும் விதம் எனலாம். அதாவது, char வகையில் தேக்கி வைக்கப்படும் தகவலானது, அந்த fieldன் வரையறுக்கப்பட்ட நீளத்தைவிடச் சிறியதாயினும் கூட வரையறுக்கப்பட்ட முழு இடத்தையும் எடுத்துக்கொள்ளும். varchar fieldல் சேமிக்கப்பட்ட தகவல், அதன் நீளத்திற்கு உண்டான இடத்தை மட்டுமே எடுத்துக்கொள்ளும்.
ஒரு எடுத்துக்காட்டிற்கு, கீழுள்ள டேபிளைப் பார்ப்போம்.
mytable
charfield
|
char(10) |
varcharfield
|
varchar(10) |
இந்த டேபிளில் இரண்டு fieldகள் இருக்கின்றன, ஒன்று char வகை, இன்னொன்று varchar வகை. ஒரே மாதிரியான தகவல் இரண்டு columnகளிலும் உள்ளிடப்படுகிறது என்று வைத்துக்கொள்வோம், கீழ்க்கண்டவாறு:
Mytableன் உள்ள தகவல்
| Sno |
charfield |
varcharfield |
| 1 |
Tamil----- |
Tamil |
| 2 |
English--- |
English |
| 3 |
Hindi----- |
Hindi |
| 4 |
Telugu---- |
Telugu |
முதல் ரெக்கார்டின் நீளம் 5. char fieldல் மொத்தம் 10 இடங்கள் ஒவ்வொரு ரெக்கார்டுக்கும் ஒதுக்கப்படும். முதல் ரெக்கார்டின் நீளமான 5 இடங்கள் போக, மீதமுள்ள 10 இடங்களிலும் காலியான இடம் நிரப்பப்படும். இங்கு காலியான இடங்களைக் குறிக்க ஹைஃபன் (-) பயன்படுத்தி இருக்கிறேன். ஆனால், varchar fieldல் Tamil என்ற சொல்லுக்கு 5 இடங்கள் மட்டுமே எடுத்துக்கொள்ளப்படும். ஒதுக்கப்பட்ட மீதமுள்ள 5 இடங்களும் மிச்சம். தேவையான அளவுக்கு மெல் இடத்தை varchar எடுத்துக்கொள்ளாது. ஆயிரக்கணக்கான வரிசைகள் உள்ள ஒரு தகவல்தளத்தில், varchar மாறிலி நிறைய இடத்தை மிச்சப்படுத்தும்.
வடிவமைக்கப்பட்ட டேபிளில் அதிகமான வரிசைகள்/ரெக்கார்ட்கள் nullஆக இருக்குமென்றால், varchar பயன்படுத்துவதுதான். நல்லது, ஏனெனில், char வகை field, எப்படியும் ஒதுக்கப்பட்ட இடத்தை எடுத்துக்கொள்ளும். varchar என்ன தேவையோ அதை மட்டுமே எடுத்துக்கொள்ளும்.
பிறகு எதற்காக இந்த char?
ஒரே முக்கியமான பதில், "வேகம்".
ஒரு உதாரணம் பார்ப்போமா? வாருங்கள், நம்முடைய உதாரண டேபிளில் இரண்டாவது ரெக்கார்டை மூன்றாவதாகவும், மூன்றாவதாக இருந்த ஹிந்தியை இரண்டாவதுக்கும் மாற்றலாம், இப்படி:
மாற்றி அமைக்கப்பட்ட Mytableன் உள்ள தகவல்
Sno
|
charfield
|
varcharfield
|
1
|
Tamil----- |
Tamil |
2
|
Hindi----- |
Hindi
|
3
|
English--- |
English |
4
|
Telugu---- |
Telugu
|
பார்ப்பதற்கு அதற்குப் பதிலாக இது என்று தெரிந்தாலும், உண்மை அது அல்ல. இரண்டாவது ரெக்கார்டை எடுத்துக்கொள்வோம். char fieldல் English என்ற எழுத்திற்கு பதில் Hindi என்று ஆகி இருக்கிறது. இரண்டு எழுத்துக்கள் கம்மி. அதனால் அந்த இரண்டு எடத்திலும் வெற்றிடம் நிரப்பப்பட்டு விட்டது. varcharfieldல் Englishக்குப் பதில் Hindi என்ற ஐந்து இடங்கள் மட்டுமே தேவைப்படுவதால், இன்னமும் இரண்டு எழுத்துக்களும் மிச்சம். variable character field இல்லையா, அதனால் இரண்டு இடங்கள் மிச்சம். முதலில் 7 இடங்கள் தேவைப்பட்டன, இனிமேல் 5 இடமே போதும்.
இது நன்று. ஆனால் அடுத்த ரெக்கார்டைப் பார்ப்போம். ஐந்து எழுத்து Hindiக்குப் பதில், ஏழு எழுத்து English. எப்படியும் இந்த charfieldக்கு 10 இடங்கள் உள்ளன. இனிமேல் 3 காலி இடம் போதும், ஒதுக்கப்பட்ட பத்தில் 7 இடங்களில் எழுத்துக்கள் இருக்கும். அடுத்ததாக varcharfieldக்கு வருவோம். இதில் ஏற்கனவே இருந்த Hindiக்கு 5 இடங்கள் இருந்தன. இப்பொழுது 7 எழுத்துக்களுக்கும் இடம் வேண்டும். என்ன செய்வது?
Hindi என்ற எழுத்துக்களின் ஐந்து இடங்களை Engli என்ற எழுத்துக்கள் முதலில் நிரப்பும். இப்பொழுது shக்கு இரண்டு இடங்கள் வேண்டும். இனிமேல் புதிதாக இரண்டு இடங்களை உருவாக்க முடியாது. ஏனென்றால், முன்பு variable character fieldல் இருந்த Hindi ஆகிய ஐந்து எழுத்துக்கள் முடிந்ததுமே அடுத்த வரி ஆரம்பித்துவிட்டது. எனவே தனியாக ஒரு இடத்தில் இந்த sh சேமிக்கப்படும். பிறகு இந்த ரெக்கார்டுக்கான ஒரு ரெஃபரன்ஸ் தகவல்தளத்தில் உருவாக்கப்படும். இந்த ரெஃபரன்சின்படி, எப்பொழுதெல்லாம் இந்த மூன்றாவது வரி வினவலின் போது அனுப்பப்படுகிறதோ, அப்பொழுதெல்லாம் இந்த ரெஃபரன்சில் குறிப்பிடப்பட்டிருக்கும் இடத்தில் சேமிக்கப்பட்ட எழுத்துக்களையும் தகவல்தளம் தேடிப்பார்க்கும். ஒரு குத்துமதிப்பாக, கீழ்க்கண்டவாறு தகவல்தளத்தின் உள்ளே ரெக்கார்டுகள் இருப்பதாக வைத்துக்கொள்ளலாம்.
varcharfield சேமிக்கப்பட்ட விதம்
Memory Address
|
charfield
|
varcharfield |
Reference
|
| place1 |
Tamil----- |
Tamil |
|
place2
|
Hindi----- |
Hindi |
|
place3
|
English--- |
Engli |
place5 |
place4
|
Telugu |
Telugu |
|
| place5 |
|
sh |
|
மூன்றாவது ரெக்கார்ட் இத்தனை நேரமும் place3 என்ற இடத்தில் மட்டுமே இருந்தது. ஆனால் Hindi-யை English என்று மாற்றியபிறகு, மூன்றாவது ரெக்கார்ட் place3 மற்றும் place5ன் தொகுப்பாக இருக்கிறது. இதோடு நிற்காது, ஒரு வேளை இந்த Englishஐ portugueseஎன்று மாற்றினால் விளைவு இன்னமும் மோசமாகும்:
varcharfield சேமிக்கப்பட்ட விதம்
Memory Address
|
charfield
|
varcharfield
|
Reference
|
| place1 |
Tamil----- |
Tamil
|
|
place2
|
Hindi----- |
Hindi
|
|
place3
|
English--- |
portu
|
place5 |
place4
|
Telugu |
Telugu
|
|
place5
|
|
gu
|
place6
|
| place6 |
|
ese |
|
portuguese என்ற சரத்திற்கு 10 இடங்கள் வேண்டும். place3ல் ஐந்து இடங்களும் place5ல் இரண்டு இடங்களும் ஏற்கனவே இருக்கின்றன. இன்னமும் தேவைப்படும் மூன்று இடங்களுக்கு வேறு இடத்திற்குத்தான் போகவேண்டும். அந்த இடத்தை place6 என்று வைத்துக்கொள்வோம். எனவே இந்த reference ஒரு இடத்தில் இருக்கும். இப்பொழுது ஒரு வினவல் (query) எழுதுவோம்:
select *
from mytable
where varcharfield='
portugese'
மேற்கண்ட வினவலுக்கு, மூன்றாவது ரெக்கார்ட் பொருந்தும். ஆனால் இதை பயனருக்குக் காண்பிக்க, முதலில் place3க்குச் சென்று அங்குள்ள portuவை எடுத்துக்கொள்ளவேண்டும். பிறகு place5க்குச் சென்று அங்குள்ள guவை இதனுடன் இணைக்கவேண்டும். அதன் பிறகு place6க்குச் சென்று அங்குள்ள eseயை portuguவுடன் இணைக்கவேண்டும். இதற்கு அதிக நேரம் தேவைப்படும்.
இதுதான் varcharல் உள்ள ப்ரச்சனை. இதையே char வகை மாறிலியில் தேக்கியிருந்தால் எல்லா எழுத்துக்களும் ஒரே இடத்தில்தான் இருந்திருக்கும். அதனால் அங்கே இங்கே என்ற அலைச்சல் இல்லை. விரைவாக தகவல்கள் வந்துவிடும்.
எனவே, அடிக்கடி அளவில் மாறும் தன்மையுடைய தகவல் என்றால், அப்படிப்பட்ட தகவலைச் சேமிக்க char மாறிலிதான் சிறந்தது. அதிக அடிக்கடி மாற்றங்கள் நிகழாது என்றால் அப்பொழுது varcharதான் சிறந்தது. இதனால் வன்தகட்டில்(hard disk) நிறைய இடமும் மிச்சமாகும்.
சுருக்கமாகச் சொன்னால், கணிப்பொறி சேமிப்பு இடத்தைப் (storage) பற்றி கவலைகொள்ளத் தேவையில்லாதவர்கள் char மாறிலியையும், கணிப்பொறி நினைவிடத் (RAM) தேவையைப் பற்றி ப்ரச்சனை இல்லாதவர்கள் varchar மாறிலியையும் கொஞ்சம் தாராளமாகப் பயன்படுத்தலாம்.