mysql - 如何在 MySQL 中处理引号和撇号以进行字符串比较,以便它们匹配(整理)

标签 mysql quotes collation diacritics apostrophe

MySQL 使用排序规则进行字符串比较,因为某些字符应该匹配

例子:

SELECT 'é' = 'e' COLLATE utf8_unicode_ci;
SELECT 'oe' = 'œ' COLLATE utf8_unicode_ci; 

都返回真

现在,我怎样才能对引号 (') 和撇号 (') 做同样的事情

这不是同一个字符,写“it's”或“l'oiseau”(法语)时正确使用的字符都是撇号。

事实是 utf8_general_ci 或 utf8_unicode_ci 都不整理它们。

简单的解决方案是将所有内容存储在引号中,并在用户进行搜索时替换所有撇号,但这是错误的。

真正的解决方案是创建一个基于 utf8_unicode_ci 的自定义排序规则并将两者标记为等效,但这需要编辑 XML 配置文件并重新启动数据库,这并不总是可行的。

你会怎么做?

最佳答案

自定义排序规则似乎是最合适的,但如果这不可能,也许您可​​以调整搜索以使用正则表达式。它并不完全理想,但在某些情况下可能有用。至少它允许您以正确的格式存储数据(无需替换引号),并且只需对搜索查询本身进行替换:

INSERT INTO mytable VALUES
(1, 'Though this be madness, yet there is method in ''t'),
(2, 'Though this be madness, yet there is method in ’t'),
(3, 'There ’s daggers in men’s smiles'),
(4, 'There ’s daggers in men''s smiles');

SELECT * FROM mytable WHERE data REGEXP 'There [\'’]+s daggers in men[\'’]+s smiles';

+----+--------------------------------------+
| id | data                                 |
+----+--------------------------------------+
|  3 | There ’s daggers in men’s smiles     |
|  4 | There ’s daggers in men's smiles     |
+----+--------------------------------------+

SELECT * FROM mytable WHERE data REGEXP 'Though this be madness, yet there is method in [\'’]+t';

+----+-----------------------------------------------------+
| id | data                                                |
+----+-----------------------------------------------------+
|  1 | Though this be madness, yet there is method in 't   |
|  2 | Though this be madness, yet there is method in ’t   |
+----+-----------------------------------------------------+

关于mysql - 如何在 MySQL 中处理引号和撇号以进行字符串比较,以便它们匹配(整理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4384180/

相关文章:

php - MySQL 使用 PHP sprintf 插入到 NULL INT 列

java - 如何在 Java 字符串中输入引号?

mysql - 如何使用 bash shell 脚本更改临时 root MySQL 密码?

bash - 为什么通过 ssh 传递带有引号空格的命令不起作用?

unicode - 从 SQL Server 2008 R2 中检索多语言数据(中文、日文...)并在 Java webapp 中显示

php - MySQL、SQL、PHP 我可以从由第三个连接的两个表中获取数据吗

mysql - 如何为表中的每一行运行特定的 sql 查询?

sql-server - 在 SQL Server 中什么时候必须使用 NVARCHAR/NCHAR 而不是 VARCHAR/CHAR?

node.js - Node INTL 语言环境排序规则

php - 如何解析具有精确字符串长度的字符串?