另一种方法是创建一个持久虚拟列,其中 mysql 自动存储这样的规范化电话号码。可以使用 GMB describe 中的功能。
注意:创建虚拟列的函数是针对 MariaDB 的,我不确定它是否与 MySQL 中的语法相同
然后你可以像这样使用你的功能:
SELECT * FROM Contacts WHERE FormatFieldHere(phoneNumber) LIKE '%123555%'
样本
创建表格并插入行
MariaDB [test]> CREATE TABLE `Contacts` (
-> `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
-> `phoneNumber` varchar(32) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.034 sec)
MariaDB [test]>
MariaDB [test]> INSERT INTO `Contacts` (`id`, `phoneNumber`)
-> VALUES
-> (1, '(123) 555-1234'),
-> (2, '+49 2163 9988-111');
Query OK, 2 rows affected (0.005 sec)
Records: 2 Duplicates: 0 Warnings: 0
查看行
MariaDB [test]> SELECT * FROM `Contacts`;
+----+-------------------+
| id | phoneNumber |
+----+-------------------+
| 1 | (123) 555-1234 |
| 2 | +49 2163 9988-111 |
+----+-------------------+
2 rows in set (0.000 sec)
添加虚拟列和索引并查看新行
MariaDB [test]> ALTER TABLE `Contacts`
-> ADD COLUMN
-> `phoneNumberN` VARCHAR(32) AS ( REGEXP_REPLACE(`phoneNumber`, '[^0-9]', '') ) PERSISTENT;
Query OK, 2 rows affected (0.032 sec)
Records: 2 Duplicates: 0 Warnings: 0
MariaDB [test]> ALTER TABLE `Contacts`
-> ADD KEY
-> `IDX_phoneNumberN` (`phoneNumberN`);
Query OK, 0 rows affected (0.036 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [test]> SELECT * FROM `Contacts`;
+----+-------------------+---------------+
| id | phoneNumber | phoneNumberN |
+----+-------------------+---------------+
| 1 | (123) 555-1234 | 1235551234 |
| 2 | +49 2163 9988-111 | 4921639988111 |
+----+-------------------+---------------+
2 rows in set (0.000 sec)
添加 2 个其他测试行
MariaDB [test]> INSERT INTO `Contacts` (`id`, `phoneNumber`)
-> VALUES
-> (3, '222 (123) 555-1234'),
-> (4, '222 +49 2163 9988-111');
Query OK, 2 rows affected (0.029 sec)
Records: 2 Duplicates: 0 Warnings: 0
在新列上选择
MariaDB [test]> SELECT * from `Contacts` WHERE `phoneNumberN` LIKE '%123555%';
+----+--------------------+---------------+
| id | phoneNumber | phoneNumberN |
+----+--------------------+---------------+
| 1 | (123) 555-1234 | 1235551234 |
| 3 | 222 (123) 555-1234 | 2221235551234 |
+----+--------------------+---------------+
2 rows in set (0.001 sec)
MariaDB [test]>