我需要在数据库中搜索一个文本字段,以避免特殊字符但同一短语的不匹配。
例如,如果将我在数据库字段中的搜索词另存为“我喜欢mysql查询”,“我喜欢mysql和查询”,“我喜欢mysql和查询”,“我喜欢” mysql和查询”等。
我正在考虑使用用于URL重写的PHP函数将短语转换为始终将其平展为“我喜欢mysql和查询”,但是我不确定是否可以在查询中对其进行展平?
答案 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)