在MariaDB中返回仅包含字母数字字符的行的2种方法

发布于

以下是在MariaDB中返回仅包含字母数字字符的行的两种方法。

字母数字字符是字母字符和数字字符。

示例数据

我们将使用以下数据作为示例:

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'),
    ('()'),
    ('!@#&()–[{}]:;'',?/*'),
    ('`~$^+=<>“'),
    ('$1.50'),
    ('Player 456'),
    ('007'),
    (null),
    (''),
    ('é'),
    ('É'),
    ('é 123'),
    ('ø'),
    ('ø 123');
SELECT c1 FROM t1;

结果:

+———————-+ | c1 | +———————-+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | [email protected] | | 1 + 1 | | () | | !@#&()–[{}]:;’,?/* | | `~$^+=<>“ | | $1.50 | | Player 456 | | 007 | | NULL | | | | é | | É | | é 123 | | ø | | ø 123 | +———————-+

选项 1:比较[:alnum:]

MariaDB 的正则表达式功能包括对 POSIX 字符类的支持。因此,我们可以在正则表达式中使用 POSIX 字符类来查找包含字母数字字符的行。[:alnum:]

SELECT c1 FROM t1 
WHERE c1 REGEXP '^[[:alnum:]]+$';

结果:

+——-+ | c1 | +——-+ | Music | | Café | | 007 | | é | | É | | ø | +——-+

这只返回那些只包含字母数字字符的行。如果行同时包含字母数字和非字母数字字符,则不会返回该行。

请注意,空格字符被认为是非字母数字的,因此如果我们想包含空格,我们可以这样做:

SELECT c1 FROM t1 
WHERE c1 REGEXP '^[[:alnum:] ]+$';

结果:

+—————+ | c1 | +—————+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | Player 456 | | 007 | | é | | É | | é 123 | | ø | | ø 123 | +—————+

要返回所有包含字母数字字符的行(即使该行还_包含_非字母数字字符),我们可以这样做:

SELECT c1 FROM t1 
WHERE c1 REGEXP '[[:alnum:]]';

结果:

+——————-+ | c1 | +——————-+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | [email protected] | | 1 + 1 | | $1.50 | | Player 456 | | 007 | | é | | É | | é 123 | | ø | | ø 123 | +——————-+

选项 2:指定字符范围

另一种方法是在正则表达式中指定字符范围。

例:

SELECT c1 FROM t1 
WHERE c1 REGEXP '^[A-Za-z0-9]+$';

结果:

+——-+ | c1 | +——-+ | Music | | 007 | +——-+

您会注意到,这返回的行数比第一个示例少。这是因为我没有在我的范围内包含,,或字符,因此包含这些字符的任何行都将从输出中排除。é``É``ø

因此,使用此方法时需要小心,以防意外排除应包含的字符。

但是,根据这个范围,我们可以包含这样的空格:

SELECT c1 FROM t1 
WHERE c1 REGEXP '^[A-Za-z0-9 ]+$';

结果:

+————+ | c1 | +————+ | Music | | Live Music | | Player 456 | | 007 | +————+

我们可以使用以下方法来包含包含我们_范围内字符的所有_行(即使它们也包含此范围之外的字符):

SELECT c1 FROM t1 
WHERE c1 REGEXP '[A-Za-z0-9]';

结果:

+——————-+ | c1 | +——————-+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | [email protected] | | 1 + 1 | | $1.50 | | Player 456 | | 007 | | é 123 | | ø 123 | +——————-+