我有一个成员搜索功能,您可以在其中提供部分姓名,并且返回的结果应该是至少具有与该输入匹配的用户名、名字或姓氏之一的所有成员。这里的问题是有些名字有“奇怪”的字符,比如é
in Renée
用户不想输入奇怪的字符而是输入正常的 ASCII 替代字符e
.
在 PHP 中,我使用 iconv 将输入字符串转换为 ASCII(以防万一有人输入奇怪的字符)。然而,在数据库中,我还应该将奇怪的字符转换为 ASCII(显然)以使字符串匹配。
我尝试了以下方法:
SELECT
CONVERT(_latin1'Renée' USING ascii) t1,
CAST(_latin1'Renée' AS CHAR CHARACTER SET ASCII) t2;
(这是两次尝试。) 两者都不起作用。都有Ren?e
作为输出。问号应该是e
。如果输出就可以了Ren?ee
因为我可以在转换后删除所有问号。
正如您可以想象的那样,我要查询的列是编码为 Latin1 的。
Thanks.
您不需要转换任何东西。您的要求是比较两个字符串并询问它们是否相等,忽略重音符号;数据库服务器可以使用整理为您做到这一点:
非 UCA 排序规则具有一对一的关系
从字符代码到权重的映射。
在 MySQL 中,这样的排序规则是 case
不敏感和重音不敏感。
utf8_general_ci 是一个示例:'a',
'A'、'À' 和 'á' 各有不同的含义
字符代码但都有权重
0x0041 并比较是否相等。
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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)