当前位置: 首页 > 面试题库 >

MySQL匹配具有ASCII版本的Unicode字符

邢和光
2023-03-14
问题内容

我正在运行MySQL 5.1.50,并具有一个如下表:

organizations | CREATE TABLE `organizations` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `url` text CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  `phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=25837 DEFAULT CHARSET=utf8 |

我遇到的问题是MySQL正在将Unicode字符与ascii版本匹配。例如,当我搜索包含’é’的单词时,它将匹配具有’e’的单词,反之亦然:

mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT id, name FROM `organizations` WHERE `name` = 'Universite de Montreal';
    +-------+-------------------------+
| id    | name                    |
+-------+-------------------------+
| 16973 | Université de Montreal  |
+-------+-------------------------+
1 row in set (0.01 sec)

我从PHP和命令行控制台获得了这些结果。如何从SELECT查询中获得准确的匹配?

谢谢!


问题答案:

您指定的nametext CHARACTER SET utf8 COLLATE utf8_unicode_ci告诉MySQL 在匹配和排序时将
eé 视为等效。这种归类和utf8_general_ci两者使很多事情都等效。

一旦您学习了如何阅读图表,http://www.collat​​ion-
charts.org/
是一个很好的资源,这很容易。

如果希望将 eé 等视为不同,则必须选择其他排序规则。要找出服务器上的排序规则(假设您限于UTF-8编码):

mysql> show collation like 'utf8%';

并选择使用归类图作为参考。

还有一个特殊的排序规则utf8_bin,其中没有对等项,它是二进制匹配项。

唯一的MySQL的Unicode排序规则我所知道的是不特定语言的utf8_unicode_ciutf8_general_ciutf8_bin。他们很奇怪。排序规则的真正目的是使计算机像人们期望的那样进行匹配和排序。匈牙利语和土耳其语字典的条目根据不同的规则排序。指定排序规则后,您可以根据此类本地规则进行排序和匹配。

例如,丹麦人似乎认为e和é等效,但冰岛人则不这样做:

mysql> select _utf8'e' collate utf8_danish_ci
    -> = _utf8'é' collate utf8_danish_ci as equal;
+-------+
| equal |
+-------+
|     1 |
+-------+

mysql> select _utf8'e' collate utf8_icelandic_ci
    -> = _utf8'é' collate utf8_icelandic_ci as equal;
+-------+
| equal |
+-------+
|     0 |
+-------+

另一个方便的技巧是用一堆您感兴趣的字符填充一列表(通过脚本更容易),然后MySQL可以告诉您等效项:

mysql> create table t (c char(1) character set utf8);
mysql> insert into t values ('a'), ('ä'), ('á');
mysql> select group_concat(c) from t group by c collate utf8_icelandic_ci;
+-----------------+
| group_concat(c) |
+-----------------+
| a               |
| á               |
| ä               |
+-----------------+

mysql> select group_concat(c) from t group by c collate utf8_danish_ci;
+-----------------+
| group_concat(c) |
+-----------------+
| a,á             |
| ä               |
+-----------------+

mysql> select group_concat(c) from t group by c collate utf8_general_ci;
+-----------------+
| group_concat(c) |
+-----------------+
| a,ä,á           |
+-----------------+


 类似资料:
  • 问题内容: 我有以下仅允许字母的正则表达式: 如何使用p {L}(通用-任何语言,例如德语,英语等)来执行此操作 我试过了 但所有字母a =“ aB”均返回null 问题答案: 从ECMAScript2018开始,JavaScript终于原生支持Unicode属性转义。 对于较旧的版本,您要么需要自己定义所有相关的Unicode范围。或者,您可以将StevenLevithan的程序包与Unicod

  • 问题内容: 在.net中,您可以使用它来匹配任何字母,如何在Python中进行匹配?即,我想匹配任何大写,小写和带重音的字母。 问题答案: Python的模块尚不支持Unicode属性。但是您可以使用该标志编译正则表达式,然后字符类速记也将与Unicode字母匹配。 由于还将匹配数字,因此您需要从字符类中减去数字以及下划线: 将匹配任何Unicode字母。

  • 问题内容: 有谁知道Mysql的regexp是否支持unicode?我一直在做一些研究,大多数博客等都表明存在问题或不支持。我想知道,最好将LIKE用于unicode模式匹配,将regexp用于ASCII增强模式匹配吗? 我喜欢能够在字符串开头或结尾搜索匹配项的想法,但是如果regexp不支持unicode,那么如果我的文本是unicode,则可能会很困难。 问题答案: 有谁知道Mysql的reg

  • 问题内容: 我正在尝试为PHP中的名称编写一个合理的验证器,而我的第一次尝试包括以下模式: 最终将其传递给的呼叫。据我所知,这可以与您的原始ASCII字母一起使用,但似乎在诸如Ă或张之类的易变字符上起作用。 模式本身有问题吗?也许我期望做的工作比我想象的还要多? 还是与输入的传递方式有关?我不确定是否相关,但是我确实确保在表单页面上指定UTF8编码。 问题答案: 我认为问题要比这简单得多:您忘记了

  • 我正在搜索一种转换服务器发送的字符串(JSON)的技术,该字符串包含以下内容:<code>…“Test\u00e9\u00e9\u002e9”…</code>在类似“Testé”的内容中,我找到了一个解决方案:<code>boost::replace_all(listFolder,\\u00e,é) ,我将这个boost函数与其他字母àùê等一起使用……这太痛苦了! 我想知道是否有函数自动执行这种

  • 假设我的客户支持TLS V1。0,1.1和1.2。远程站点支持TLS V1。0和1.1。双方都支持相同的密码。 我的问题是: 1-据我所知,我将始终使用我现有的最高TLS版本启动通信。在这种情况下,我将如何与另一边联系? 2-以下是客户端和服务器之间的Wireshark客户端HELLO捕获,如上所述。 这种连接尝试最终导致“无法创建SSL/TLS安全通道”。我怀疑这与“TLSV1.1记录层”和“版