Dưới đây là hai tùy chọn để tìm những hàng có chứa ký tự chữ và số trong MySQL.
Ký tự chữ và số là ký tự chữ cái và ký tự số.
Dữ liệu mẫu
Chúng tôi sẽ sử dụng dữ liệu sau cho các ví dụ của chúng tôi:
CREATE TABLE t1 (
c1 varchar(255) NULL
);
INSERT INTO t1 VALUES
('Music'),
('Live Music'),
('Café'),
('Café Del Mar'),
('100 Cafés'),
('[email protected]'),
('1 + 1'),
('()'),
('[email protected]#&()–[{}]:;'',?/*'),
('`~$^+=<>“'),
('$1.50'),
('Player 456'),
('007'),
(null),
(''),
('é'),
('É'),
('é 123'),
('ø'),
('ø 123');
SELECT c1 FROM t1;
Kết quả:
+----------------------+ | c1 | +----------------------+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | [email protected] | | 1 + 1 | | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | $1.50 | | Player 456 | | 007 | | NULL | | | | é | | É | | é 123 | | ø | | ø 123 | +----------------------+
Tùy chọn 1:So sánh với [:alnum:]
Chúng ta có thể sử dụng REGEXP
của MySQL toán tử để so sánh cột của chúng tôi với một biểu thức chính quy.
Khả năng biểu thức chính quy của MySQL bao gồm hỗ trợ cho các lớp ký tự POSIX. Do đó, chúng ta có thể sử dụng [:alnum:]
Lớp ký tự POSIX trong biểu thức chính quy của chúng tôi để tìm các hàng có chứa ký tự chữ và số.
SELECT c1 FROM t1
WHERE c1 REGEXP '^[[:alnum:] ]+$';
Kết quả:
+-------+ | c1 | +-------+ | Music | | Café | | 007 | | é | | É | | ø | +-------+
Điều đó chỉ trả về những hàng không chứa gì ngoài các ký tự chữ và số. Nếu một hàng chứa cả ký tự chữ và số và không phải chữ và số, thì hàng đó sẽ không được trả về.
Ký tự khoảng trắng được coi là không phải chữ và số, và vì vậy nếu chúng ta muốn bao gồm khoảng trắng, chúng ta có thể thực hiện điều này:
SELECT c1 FROM t1
WHERE c1 REGEXP '^[[:alnum:] ]+$';
Kết quả:
+---------------+ | c1 | +---------------+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | Player 456 | | 007 | | é | | É | | é 123 | | ø | | ø 123 | +---------------+
Để trả lại tất cả các hàng chứa các ký tự chữ và số (ngay cả khi hàng cũng chứa các ký tự không phải chữ và số), chúng ta có thể thực hiện điều này:
SELECT c1 FROM t1
WHERE c1 REGEXP '[[:alnum:]]';
Kết quả:
+-------------------+ | c1 | +-------------------+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | [email protected] | | 1 + 1 | | $1.50 | | Player 456 | | 007 | | é | | É | | é 123 | | ø | | ø 123 | +-------------------+
Tùy chọn 2:Chỉ định một phạm vi ký tự
Một cách khác để làm điều đó là cung cấp một biểu thức chính quy cung cấp một loạt các ký tự. Chúng tôi vẫn có thể sử dụng REGEXP
để thực hiện việc này.
Ví dụ:
SELECT c1 FROM t1
WHERE c1 REGEXP '^[A-Za-z0-9 ]+$';
Kết quả:
+-------+ | c1 | +-------+ | Music | | 007 | +-------+
Điều này trả lại ít hàng hơn với ví dụ đầu tiên của chúng tôi. Đó là bởi vì tôi không bao gồm é
, É
hoặc ø
các ký tự trong phạm vi của tôi, và vì vậy bất kỳ hàng nào chứa các ký tự đó đều bị loại trừ khỏi đầu ra.
Do đó, bạn sẽ cần phải cẩn thận khi sử dụng phương pháp này, trong trường hợp bạn vô tình loại trừ các ký tự mà bạn nên bao gồm.
Tuy nhiên, theo phạm vi này, chúng ta có thể bao gồm các khoảng trắng như sau:
SELECT c1 FROM t1
WHERE c1 REGEXP '^[A-Za-z0-9 ]+$';
Kết quả:
+------------+ | c1 | +------------+ | Music | | Live Music | | Player 456 | | 007 | +------------+
Và chúng tôi có thể sử dụng phần sau để bao gồm tất cả các hàng chứa các ký tự từ phạm vi của chúng tôi (ngay cả khi chúng cũng chứa các ký tự bên ngoài phạm vi này):
SELECT c1 FROM t1
WHERE c1 REGEXP '[A-Za-z0-9]';
Kết quả:
+-------------------+ | c1 | +-------------------+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | [email protected] | | 1 + 1 | | $1.50 | | Player 456 | | 007 | | é 123 | | ø 123 | +-------------------+
Các lựa chọn thay thế cho REGEXP
Trong MySQL, RLIKE
và REGXP
toán tử là từ đồng nghĩa của REGEXP_LIKE()
. Do đó, chúng tôi có thể thay thế bất kỳ ví dụ nào trước đây bằng RLIKE
hoặc REGEXP_LIKE()
.
Ví dụ về RLIKE
:
SELECT c1 FROM t1
WHERE c1 RLIKE '^[[:alnum:]]+$';
Ví dụ về REGEXP_LIKE()
:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[[:alnum:]]+$');