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

MySQL: ใช้ WHERE BINARY สำหรับการเปรียบเทียบ Case-Sensitive

ใน MySQL การเปรียบเทียบสตริงเริ่มต้นเป็น Case-Insensitive (ไม่แยกตัวพิมพ์ใหญ่/เล็ก) หากต้องการเปรียบเทียบแบบ Case-Sensitive ให้ใช้คีย์เวิร์ด BINARY

ตัวอย่างเปรียบเทียบ

Case 1: Case-Insensitive (ค่าเริ่มต้น)

SELECT 'joHN' = 'JOHN' AS Result;

ผลลัพธ์: 1 (True - ถือว่าเท่ากัน)

Case 2: Case-Sensitive ด้วย BINARY

SELECT BINARY 'joHN' = 'JOHN' AS Result;

ผลลัพธ์: 0 (False - ไม่เท่ากัน)

SELECT BINARY 'JOHN' = 'JOHN' AS Result;

ผลลัพธ์: 1 (True - เท่ากันทุกตัว)

ใช้ BINARY กับคอลัมน์ใน WHERE

SELECT * FROM table_name
WHERE BINARY column_name = 'exact_value';

กำหนด Case-Sensitive ตั้งแต่สร้างตาราง

เพิ่ม BINARY หลังชนิดข้อมูลคอลัมน์:

CREATE TABLE binaryKeywordDemo (
    Id INT NOT NULL AUTO_INCREMENT,
    Name VARCHAR(10) BINARY,  -- คอลัมน์นี้ Case-Sensitive ตลอด
    PRIMARY KEY (Id)
);

เพิ่มข้อมูลทดสอบ

INSERT INTO binaryKeywordDemo (Name) VALUES
('bOB'), ('bob'), ('BOB'), ('Bob'), ('bOb'), ('boB');

ข้อมูลในตาราง (เก็บทุก case แยกกันได้):

+----+------+
| Id | Name |
+----+------+
|  1 | bOB  |
|  2 | bob  |
|  3 | BOB  |
|  4 | Bob  |
|  5 | bOb  |
|  6 | boB  |
+----+------+

ค้นหาแบบ Case-Sensitive

SELECT * FROM binaryKeywordDemo WHERE Name = 'Bob';

ผลลัพธ์: คืนแถว Id=4 เท่านั้น (Bob พิมพ์ใหญ่ตัวแรกอย่างเดียว)

+----+------+
| Id | Name |
+----+------+
|  4 | Bob  |
+----+------+

สรุปการใช้ BINARY

รูปแบบผลลัพธ์ใช้เมื่อ
col = 'val'Case-Insensitiveค้นหาทั่วไป
BINARY col = 'val'Case-Sensitiveต้องการแมตช์ตัวพิมพ์ใหญ่/เล็กตรงกัน
col = BINARY 'val'Case-Sensitiveเท่ากับข้างบน
VARCHAR(n) BINARYคอลัมน์ Case-Sensitive ตลอดออกแบบตารางตั้งแต่แรก

ข้อสังเกต

  • BINARY ทำให้เปรียบเทียบแบบ byte-by-byte (เร็วกว่า COLLATE)
  • สำหรับ Unicode/Thai ควรใช้ COLLATE utf8mb4_bin แทน เพื่อรองรับอักขระหลายไบต์
  • BINARY สร้างดัชนีไม่ได้ (non-indexable) หากใช้บ่อย ควรสร้างคอลัมน์ BINARY แยกหรือใช้ functional index (MySQL 8.0+)