Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL SELECT FirstName ที่ LastName เหมือนกันแตกต่าง Case (Case Insensitive)

Case Insensitive Comparison ด้วย LOWER() หรือ UPPER()

MySQL Default Collation (utf8mb4_general_ci, utf8_general_ci) เป็น Case Insensitive แล้ว แต่ถ้า Column ใช้ Collation Case Sensitive (_cs, _bin) ต้อง Normalize เอง

ตัวอย่าง: Smith vs smith, Brown vs brown

CREATE TABLE DemoTable623 (
    FirstName VARCHAR(100),
    LastName VARCHAR(100),
    Age INT
);

INSERT INTO DemoTable623 VALUES
('John', 'Smith', 23),
('Adam', 'smith', 23),
('Chris', 'Brown', 24),
('Robert', 'brown', 21);

Query: หา FirstName ที่ LastName = 'smith' (Case Insensitive)

SELECT FirstName FROM DemoTable623 
WHERE LOWER(LastName) = 'smith';

ผลลัพธ์: John, Adam

+-----------+
| FirstName |
+-----------+
| John      |
| Adam      |
+-----------+

วิธีอื่นๆ สำหรับ Case Insensitive

MethodQueryPerformanceหมายเหตุ
LOWER()WHERE LOWER(col) = 'value'Full Scan (Non-SARGable)Standard
UPPER()WHERE UPPER(col) = 'VALUE'Full ScanStandard
COLLATEWHERE col = 'value' COLLATE utf8mb4_general_ciอาจใช้ Index ได้MySQL Specific
Default CollationWHERE col = 'value' (ถ้า Table _ci)ใช้ Index ได้Best Practice

Best Practice: ใช้ Collation Case Insensitive ตั้งแต่ Schema Design

CREATE TABLE users (
    last_name VARCHAR(100) COLLATE utf8mb4_general_ci  -- _ci = Case Insensitive
);

แล้ว Query ธรรมดา:

SELECT FirstName FROM DemoTable623 WHERE LastName = 'smith';  -- Match Smith, smith, SMITH

Functional Index สำหรับ Case Insensitive Search บน Column _cs/_bin

-- MySQL 8.0.13+
ALTER TABLE DemoTable623 
ADD INDEX idx_lower_lastname ((LOWER(LastName)));

-- Query ใช้ Index ได้
SELECT FirstName FROM DemoTable623 WHERE LOWER(LastName) = 'smith';

Case Sensitive Search (เมื่อ Collation เป็น _ci)

-- บังคับ Case Sensitive
SELECT * FROM DemoTable623 WHERE LastName = 'Smith' COLLATE utf8mb4_bin;
-- หรือ
SELECT * FROM DemoTable623 WHERE BINARY LastName = 'Smith';

Unicode/Thai Consideration

ภาษาไทยไม่มี Upper/Lower Case - LOWER()/UPPER() ไม่เปลี่ยนแปลงตัวอักษรไทย

SELECT LOWER('สมชาย'), UPPER('สมชาย');  -- สมชาย, สมชาย