如何在不保存的情况下将列转换为ASCII,以检查是否与外部ASCII字符串匹配?

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编码的.

谢谢.

Vin*_*ren 7

你不需要转换任何东西.你的要求是比较两个字符串并询问它们是否相等,忽略重音; 数据库服务器可以使用排序规则为您执行此操作:

非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)


Hal*_*gür 5

首先,它应该这样工作:

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版本是什么,你如何尝试匹配东西?


其他可能的解决方案之一是音译.

相关:PHP Transliteration

音译输入应该不是问题,但是在搜索期间实时地从永久存储(例如db)音译值可能是不可行的.所以,你可以添加三个领域,如:username_slug,firstname_sluglastname_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字段的唯一性.