مقایسه استفاده از LIKE در MySQL و PostgreSQL در مدلهای CodeIgniter 4
در هنگام پیادهسازی جستجو در پروژههایی که با فریمورک CodeIgniter 4 توسعه داده شدهاند، استفاده از عملگر لایک LIKE یکی از رایجترین روشها برای فیلتر کردن دادهها بر اساس رشتههای ورودی کاربران است. اما نکتهای که معمولاً در این زمینه نادیده گرفته میشود تفاوت در رفتار دیتابیسهای مختلف مانند پایگاه دادههای MySQL و پایگاه دادههای PostgreSQL هنگام کار با مقایسههای متنی حساس به حروف بزرگ و کوچک (case sensitivity) است.
مقایسه استفاده از LIKE در MySQL و PostgreSQL در مدلهای CodeIgniter 4
در پایگاه دادهی MySQL، جستجوهای متنی با عملگر لایک LIKE به طور پیشفرض حساس به حروف بزرگ و کوچک نیستند، مگر اینکه نوع کاراکتری (collation) جدول یا ستون به گونهای تنظیم شده باشد که تفاوت بین حروف بزرگ و کوچک را تشخیص دهد. در نتیجه شما میتوانید مستقیماً از متد like() در کلاس Builder استفاده کنید و نتیجه مطلوب را دریافت کنید.
اما در پایگاه دادهی PostgreSQL داستان متفاوت است. این دیتابیس برخلاف پایگاه دادهی MySQL، جستجو با عملگر لایک LIKE را بهصورت پیشفرض حساس به حروف انجام میدهد. بنابراین اگر کاربر عبارتی را وارد کند که حروف آن با مقدار ذخیرهشده در پایگاه داده مطابقت نداشته باشد، نتیجهای نمایش داده نخواهد شد. راهحل متداول برای این موضوع استفاده از تابع LOWER() بر روی ستونها و ورودی کاربر است تا هر دو به حروف کوچک تبدیل شوند و جستجو بهصورت غیر حساس به حروف بزرگ کوچک (case-insensitive) انجام شود.
در پروژههایی که از فریمورک CodeIgniter 4 استفاده میکنند، معمولاً ابتدا نوع درایور پایگاه داده بررسی میشود. اگر درایور برابر با PostgreSQL بود، لازم است در بخش شرطها از LOWER(column) و %term% استفاده شود. در غیر اینصورت و در شرایطی که MySQL در حال استفاده است، میتوان به سادگی از توابع like() و orLike() استفاده کرد.
نکته مهم این است که هنگام کار با مدلها در فریمورک CodeIgniter 4، بهتر است این منطق را در بخشهایی از مدل یا repository قرار دهید تا از تکرار کد نیز جلوگیری شود و کد تمیزتر و قابل نگهداریتری داشته باشید. همچنین توجه به تفاوت رفتار پایگاههای داده مختلف میتواند از بروز باگهای زمان اجرا جلوگیری کند، بهخصوص اگر پروژه قابلیت جابجایی بین دیتابیسها را داشته باشد.
if (!empty($searchTerm)) {
$searchTerm = strtolower($searchTerm);
$dbDriver = $this->db->DBDriver;
$builder->groupStart();
if ($dbDriver === 'Postgre') {
$like = '%' . $searchTerm . '%';
$builder->where("LOWER({$this->table}.name) LIKE", $like)
->orWhere("LOWER({$this->table}.sku) LIKE", $like);
} else {
$builder->like("{$this->table}.name", $searchTerm)
->orLike("{$this->table}.title", $searchTerm);
}
$builder->groupEnd();
}
در نهایت، درک درست از نحوه عملکرد لایک LIKE در دیتابیسهای مختلف و تطبیق آن با ساختار فریمورک CodeIgniter 4 میتواند تجربه کاربر نهایی را بهبود بخشد و عملکرد سیستم را نیز بهینهتر کند.



















امکان داره collation توی MySQL هم طوری تنظیم بشه که مثل PostgreSQL حساس به حروف بشه؟
بله، میشه. با انتخاب collationهایی مثل utf8mb4_bin یا استفاده از BINARY در کوئریها میشه حساسیت به حروف رو فعال کرد.
وقتی تعداد رکوردها زیاد باشه، LIKE توی هر دو دیتابیس کند نمیشه؟
بله، اگر از %term% استفاده کنید و ستون ایندکس نشده باشه، جستجو میتونه کند بشه. برای دیتابیسهای بزرگ بهتره از Full Text Index یا GIN/GIN Trigram در PostgreSQL استفاده کنید.
این روش جستجو با ایندکسهای متنی هم سازگار می مونه؟
بله، اما فقط وقتی LIKE ساده (term%) باشه. برای جستجوی داخل متن (%term%) معمولاً ایندکس متنی نیاز به Full Text Search یا Trigram Index داره تا کارایی بالا بمونه.
به جای LOWER، استفاده از ILIKE توی PostgreSQL بهتر نیست؟
دقیقا، ILIKE خودش Case-insensitive هست و معمولا سادهتر و سریعتر از ترکیب LOWER با LIKE عمل میکنه، مخصوصا وقتی ستون ایندکس شده باشه.
استفاده از LOWER روی ستونها توی PostgreSQL باعث افت سرعت سرچ نمیشه؟
بله، چون با LOWER دیتابیس باید روی هر ردیف تابع اجرا کنه و ایندکس معمولی استفاده نمیشه. بهتره ILIKE یا functional index روی LOWER(col) بسازید.