Custom Function: Anti-INITCAP
INITCAP() (Oracle/PostgreSQL) ทำให้ตัวแรกของแต่ละคำเป็นพิมพ์ใหญ่ ที่เหลือพิมพ์เล็ก MySQL ไม่มี Built-in แต่สามารถสร้าง Function เองได้
ฟังก์ชัน Anti-INITCAP: ตัวแรกพิมพ์เล็ก, ตัวอื่นพิมพ์ใหญ่
DELIMITER //
CREATE FUNCTION convertFirstLetterToLowerAndRemainingToCapital(input_str VARCHAR(250))
RETURNS VARCHAR(250)
DETERMINISTIC
BEGIN
DECLARE str_len INT;
DECLARE i INT;
DECLARE result_str VARCHAR(250);
SET str_len = CHAR_LENGTH(input_str);
SET result_str = UPPER(input_str); -- ทำให้ทั้งหมดเป็นพิมพ์ใหญ่ก่อน
SET i = 0;
WHILE (i < str_len) DO
-- ถ้าตัวก่อนเป็น Space หรือเป็นตัวแรกของสตริง -> ทำให้ตัวนี้เป็นพิมพ์เล็ก
IF (MID(result_str, i, 1) = ' ' OR i = 0) THEN
IF (i < str_len) THEN
SET result_str = CONCAT(
LEFT(result_str, i),
LOWER(MID(result_str, i + 1, 1)),
RIGHT(result_str, str_len - i - 1)
);
END IF;
END IF;
SET i = i + 1;
END WHILE;
RETURN result_str;
END //
DELIMITER ;
การทดสอบ
SELECT convertFirstLetterToLowerAndRemainingToCapital('Introduction To MySQL');
ผลลัพธ์: iNTRODUCTION tO mYSQL
ฟังก์ชัน INITCAP แบบ MySQL (ตัวแรกพิมพ์ใหญ่ ที่เหลือพิมพ์เล็ก)
CREATE FUNCTION initcap_mysql(input_str VARCHAR(250))
RETURNS VARCHAR(250)
DETERMINISTIC
BEGIN
DECLARE str_len INT;
DECLARE i INT;
DECLARE result_str VARCHAR(250);
DECLARE prev_char CHAR(1);
SET str_len = CHAR_LENGTH(input_str);
SET result_str = LOWER(input_str); -- ทำให้ทั้งหมดเป็นพิมพ์เล็กก่อน
SET i = 1;
SET prev_char = ' '; -- สมมติตัวก่อนหน้าตัวแรกเป็น Space
WHILE (i <= str_len) DO
-- ถ้าตัวก่อนเป็น Space หรือตัวแรก -> ทำให้ตัวนี้เป็นพิมพ์ใหญ่
IF (prev_char = ' ' OR i = 1) THEN
SET result_str = CONCAT(
LEFT(result_str, i - 1),
UPPER(MID(result_str, i, 1)),
RIGHT(result_str, str_len - i)
);
END IF;
SET prev_char = MID(result_str, i, 1);
SET i = i + 1;
END WHILE;
RETURN result_str;
END;
การทดสอบ INITCAP
SELECT initcap_mysql('hello world mysql');
ผลลัพธ์: Hello World Mysql
ข้อควรระวังเรื่อง Performance
- User-Defined Function (UDF) ใน MySQL ช้า เรียกต่อ Row
- ไม่ควรใช้ใน WHERE Clause หรือ JOIN Condition บนตารางใหญ่
- แนะนำใช้ใน SELECT List เท่านั้น หรือคำนวณใน Application Layer
- MySQL 8.0+ ใช้
REGEXP_REPLACEไม่ได้ (ต้อง MariaDB 10.0.5+)
Alternative: คำนวณใน Application (PHP/Python/Node.js)
-- PHP
function initcap($str) {
return ucwords(strtolower($str));
}
function anti_initcap($str) {
return lcfirst(ucwords(strtolower($str))); // หรือ logic ตามต้องการ
}