Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

So sánh hai chuỗi trong MySQL?

So sánh chuỗi đại diện số trong MySQL

Khi cột VARCHAR chứa số nhưng cần so sánh theo giá trị số, dùng CAST(... AS UNSIGNED) hoặc CAST(... AS SIGNED).

Ví dụ: So sánh chuỗi số

Tạo bảng:

mysql> CREATE TABLE compareTwoStringsDemo (
    -> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Value VARCHAR(100)
    -> );

Chèn dữ liệu:

mysql> INSERT INTO compareTwoStringsDemo(Value) VALUES 
('1235667'), ('999999'), ('999888'), ('567433'), ('2345123');

Dữ liệu:

+----+---------+
| Id | Value   |
+----+---------+
| 1  | 1235667 |
| 2  | 999999  |
| 3  | 999888  |
| 4  | 567433  |
| 5  | 2345123 |
+----+---------+

So sánh dưới dạng số (tìm 999999):

mysql> SELECT * FROM compareTwoStringsDemo 
WHERE CAST(Value AS UNSIGNED) = 999999;

Kết quả:

+----+--------+
| Id | Value  |
+----+--------+
| 2  | 999999 |
+----+--------+

Tại sao cần CAST?

  • So sánh chuỗi: '999999' < '1235667' (lexicographic, '9' > '1')
  • So sánh số: 999999 < 1235667 (numeric, đúng toán học)
  • Không CAST: WHERE Value = '999999' chỉ khớp chuỗi chính xác

Các kiểu CAST hữu ích

KiểuPhạm viDùng cho
UNSIGNED0 đến 18446744073709551615Số nguyên dương (ID, count)
SIGNED-9223372036854775808 đến 9223372036854775807Số nguyên có dấu
DECIMAL(p,s)Số thập phân chính xácTiền tệ, đo lường
DOUBLESố thực dấu phẩy độngKhoa học, ước lượng

Lưu ý hiệu năng

  • CAST() trong WHERE làm mất index trên cột VARCHAR
  • Giải pháp: Tạo generated column Value_num INT AS (CAST(Value AS UNSIGNED)) STORED rồi index trên cột đó
  • Hoặc lưu trực tiếp kiểu số nếu không cần định dạng chuỗi