在纯字符上搜索mysql文本字段

agxfikkp  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(340)

我需要搜索一个数据库上的文本字段,避免特殊字符不匹配,但为同一个短语。
例如,如果我在db字段中的搜索项保存为“i lò虚拟mysqlánd query“我想匹配搜索”i love mysqlánd query“,”我爱mysql和query“,”i lö虚拟mysqlá“nd查询”等。
我在考虑用php函数将短语转换成“我喜欢mysql和query”,但我不确定我能不能在查询中将它们转换成平地?

pxy2qtax

pxy2qtax1#

由于您的数据已经用重音符号写入数据库,您是否可以尝试使用db排序规则在重音符号之间直接Map:

$connection->query("SET NAMES utf8 COLLATE utf8_general_ci");

你可以在这里了解更多
上面的页面清楚地解释了这个排序规则将为您做什么:

mysql> SET NAMES 'utf8' COLLATE 'utf8_general_ci';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE t1
       (c1 CHAR(1) CHARACTER SET UTF8 COLLATE utf8_general_ci);
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO t1 VALUES ('a'),('A'),('À'),('á');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT c1, HEX(c1), HEX(WEIGHT_STRING(c1)) FROM t1;
+------+---------+------------------------+
| c1   | HEX(c1) | HEX(WEIGHT_STRING(c1)) |
+------+---------+------------------------+
| a    | 61      | 0041                   |
| A    | 41      | 0041                   |
| À    | C380    | 0041                   |
| á    | C3A1    | 0041                   |
+------+---------+------------------------+
4 rows in set (0.00 sec)

您也可以直接在db中测试它(测试从这里开始):

mysql> SET NAMES 'utf8' COLLATE 'utf8_general_ci';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT 'a' = 'A', 'a' = 'À', 'a' = 'á';
+-----------+-----------+-----------+
| 'a' = 'A' | 'a' = 'À' | 'a' = 'á' |
+-----------+-----------+-----------+
|         1 |         1 |         1 |
+-----------+-----------+-----------+
1 row in set (0.06 sec)

相关问题