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

时间:2018-12-03 09:08:38

标签: mysql

我需要在数据库中搜索一个文本字段,以避免特殊字符但同一短语的不匹配。

例如,如果将我在数据库字段中的搜索词另存为“我喜欢mysql查询”,“我喜欢mysql和查询”,“我喜欢mysql和查询”,“我喜欢” mysql和查询”等。

我正在考虑使用用于URL重写的PHP函数将短语转换为始终将其平展为“我喜欢mysql和查询”,但是我不确定是否可以在查询中对其进行展平?

1 个答案:

答案 0 :(得分:0)

由于您的数据已经带有重音符写入数据库,您可以尝试使用数据库排序规则直接在重音字符之间进行映射吗?

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

您可以详细了解here

上面的页面清楚地说明了该排序规则将为您做什么:

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)

您还可以直接在数据库中对其进行自我测试(测试取自here):

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)