Rud*_*die 4 mysql ascii casting latin1
我有一个成员搜索功能,您可以在其中提供部分名称,并且返回应该是具有与该输入匹配的用户名,名字或姓氏中的至少一个的所有成员.这里的问题是某些名称有像" é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;
Run Code Online (Sandbox Code Playgroud)
(这是两次尝试.)两者都不起作用.两者都有Ren?e输出.问号应该是e.如果它输出Ren?ee就没关系,因为我可以在转换后删除所有问号.
可以想象,我想要查询的列是Latin1编码的.
谢谢.
你不需要转换任何东西.你的要求是比较两个字符串并询问它们是否相等,忽略重音; 数据库服务器可以使用排序规则为您执行此操作:
非UCA排序规则具有从字符代码到权重的一对一映射.在MySQL中,这种排序规则不区分大小写并且不区分重音.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)
Run Code Online (Sandbox Code Playgroud)
首先,它应该这样工作:
SELECT * FROM `test` WHERE `name` COLLATE utf8_general_ci LIKE '%renee%';
Run Code Online (Sandbox Code Playgroud)
当test表:
+-----+--------+
| id | name |
+-----+--------+
| 1 | Renée |
| 2 | Renêe |
| 3 | Renee |
+-----+--------+
Run Code Online (Sandbox Code Playgroud)
你的MySQL版本是什么,你如何尝试匹配东西?
其他可能的解决方案之一是音译.
音译输入应该不是问题,但是在搜索期间实时地从永久存储(例如db)音译值可能是不可行的.所以,你可以添加三个领域,如:username_slug,firstname_slug和lastname_slug.插入/修改记录时,请适当设置段塞值.在搜索时,针对该段塞字段搜索音译输入.
+------+----------+---------------+----------+---------------+ ...
| id | username | username_slug | lastname | lastname_slug | ...
+------+----------+---------------+----------+---------------+ ...
| 1 | Renée | renee | La Niña | la-nina | ...
| 2 | Renêe | renee | ... | ... | ...
| 3 | Renee | renee | ... | ... | ...
+------+----------+---------------+----------+---------------+ ...
Run Code Online (Sandbox Code Playgroud)
搜索"renee"或"renèe"将匹配所有记录.
作为副作用,您可以使用该字段生成SEF(搜索引擎友好)链接,因此它们被命名..._slug,例如example.com/users/renee.当然,在这种情况下,您应该检查slug字段的唯一性.
| 归档时间: |
|
| 查看次数: |
18779 次 |
| 最近记录: |