如何在 MediaWiki 数据库中进行重音和不区分大小写的搜索?

2023-11-23

假设我的 wiki (MediaWiki 1.19.4) 中有这些页面标题:

SOMETHIng
Sómethìng
SomêthÏng
SÒmetHínG

如果用户搜索something我希望所有 4 页都作为结果返回。

目前我唯一能想到的是这个查询(MySQL Percona 5.5.30-30.2):

SELECT page_title
FROM page
WHERE page_title LIKE '%something%' COLLATE utf8_general_ci

哪个只返回SOMETHIng.

我一定走在正确的道路上,因为如果我搜索sóméthíng OR SÓMÉTHÍNG, I get SOMETHIng作为结果。如何修改查询以便获得预期的其他结果?性能在这里并不重要,因为page表仅包含约 2K 行。

这是带有相关位的表定义:

CREATE TABLE page (
    (...)
    page_title VARCHAR(255) NOT NULL DEFAULT '' COLLATE latin1_bin,
    (...)
    UNIQUE INDEX name_title (page_namespace, page_title),
)

表定义must not进行修改,因为这是 MediaWiki 的库存安装,据我所知,其代码期望以这种方式定义该字段(即存储为二进制数据的 unicode)。


我找到了完美的解决方案,无需修改或创建表。它might对性能有影响(我没有测试),但正如我在问题中所说,它是一个约 2K 行的表,所以它应该不重要。

问题的根源在于MediaWiki 将 UTF8 编码文本存储在 latin1 编码表中。这对 MediaWiki 来说并不重要,因为它知道这一点,并且它总是会使用正确的字符集查询数据库并执行其操作,本质上使用 MySQL 作为哑位容器。这样做是因为显然 MySQL 中的 UTF8 支持不足以满足其需求(请参阅 MediaWiki 中的评论)DefaultSettings.php, 多变的$wgDBmysql5).

当您希望数据库本身能够执行 UTF8 感知操作(就像我在问题中想做的那样)时,就会出现问题。你将无法做到这一点,因为据 MySQL 所知,它不存储 UTF8 编码的文本(尽管如此,如前一段所述)。

有一个明显的解决方案:将您要使用的列转换为 UTF8,如下所示CONVERT(col_name USING utf8)。这里的问题是 MySQL 试图提供危险的帮助:它认为col_name正在存储 latin1 编码的文本,它将翻译(而不是编码)每个字节转换成它的 UTF8 等价物,你将以双编码的 UTF8 结束,这显然是错误的。

如何避免 MySQL 变得如此友善和乐于助人?只是转换为二进制before正在转换为 UTF8!这样 MySQL 就不会做出任何假设,并且会完全按照要求执行:将这串位编码为 UTF8。确切的语法是CONVERT(CAST(col_name AS BINARY) USING utf8).

所以这是我现在的最后一个查询:

SELECT CONVERT(CAST(page_title AS BINARY) USING utf8)
FROM page
WHERE
    CONVERT(CAST(page_title AS BINARY) USING utf8)
        LIKE '%keyword_here%'
            COLLATE utf8_spanish_ci

现在如果我搜索something or sôMëthîNG或任何变化,我得到所有结果!

请注意,我使用了utf8_spanish_ci因为我希望搜索能够区分ñ from n但不是á from a。根据您的用例使用不同的排序规则(这是完整的列表).

相关链接:

  • MySQL:将不正确的 latin1 列转换为 utf8
  • MySQL如何在UTF-8中“不区分大小写”和“不区分重音”
  • MySQL 5.5 中可用的排序规则
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 MediaWiki 数据库中进行重音和不区分大小写的搜索? 的相关文章

  • 安装后步骤未成功完成 MySQL Mac OS Sierra

    pyEnv Anants MacBook Pro litibackend anantchandra brew postinstall mysql gt Postinstalling mysql gt usr local Cellar mys
  • 使用 PHP 显示 Mysql 中的图像

    这就是我的数据库中的表的样子 我正在尝试显示我存储的图像 它是 mimetype longblob 当我运行代码时 它会给我一个带有 的小框 没有错误 只是那个框 有谁知道错误是什么以及如何修复它 Display Index Display
  • 无法将包含数据的大型 CSV 文件转换为 mysql 数据库[重复]

    这个问题在这里已经有答案了 如何将大型文本文件转换为mysql数据库 文件大小3GB 1100万行 文件中的每一行都是这样的 1303179444 20 5811 Ahmed Al Emam male ahmed e alemam ahme
  • mysqldump创建空sql文件? [Windows 上的 php 和 mysql]

    我尝试转储数据库 我尝试了指定 mysqldump exe 的完整路径或仅使用 mysqldump 它仍然给我一个 0kb dumpfile sql 细节 编程语言 PHP 数据库 MySql 5 XX 操作系统 服务器 Windows S
  • MySQL创建表中的日期格式

    我必须使用 MySql 创建一个表 它可以按以下格式存储日期 我尝试过如下 CREATE TABLE birth date DATE 但它不起作用 因为日期格式是 YYYY MM DD 我该怎么办 谢谢 MySQL 或几乎任何其他数据库 中
  • MySQL 错误“连接过多”

    我正在将 MySQL 5 0 用于由 GoDaddy linux 托管的网站 我正在对我的网络应用程序进行一些测试 突然我注意到页面刷新速度非常慢 最后 经过漫长的等待 我到达了一个页面 上面写着 MySQL 错误 连接太多 它指向我连接到
  • mysql:谁阿米?

    有没有whoami类似mysql中的函数 我正在从远程主机连接到 mysql 命令行 我不确定我的 IP 地址是否解析为域名 我想看到类似的东西 mysql gt whoami User Host username resolved hos
  • PhpMyAdmin 导出不包括 mysqldump 中的主键

    用PhpMyAdmin导出同一个表的结构 DROP TABLE IF EXISTS test apprentis CREATE TABLE IF NOT EXISTS test apprentis a id smallint 10 NOT
  • Navicat 中的 MySQL 视图 - 如何定义“主键”?

    当我在 Navicat 中定义视图时 经常会收到以下消息 xxx 没有主键 对此表的更新将使用以下伪语句完成 UPDATE xxx SET ModifiedFieldsAndValues WHERE AllFieldsAndOldValue
  • sql连接一个表中的两个字段

    我有一个预订表 其中有两个人 我想将 person 1 作为一行返回 将 person 2 作为新行返回 但该人的 id 与人员表相关 这是我所得到的 但没有提取预订信息 SELECT people FROM select booking
  • 插入MYSQL时自动初始化GETDATE()

    类似问题 https stackoverflow com questions 17700239 mysql column automaticly current time of insert w3schools 也许有用的链接 http w
  • MySQL Spatial CONTAINS 显示错误结果

    我的 MySQL 空间搜索有一个奇怪的行为 我在 GEOM 字段 葡萄牙边界 中创建了一个多边形 然后我尝试在内部找到一个点 发现没问题 下一次尝试是查找多边形外部的点 但查询仍返回 1 个找到的行 请帮忙 我做错了什么 为什么它会找到多边
  • 如何在mysql中设置“performance_schema on”?

    我想转performance schemaON 在 mysql 中收集统计信息 我怎样才能实现这个目标 以下指南是特定于 Linux 的 但应该很容易适用于 Windows 您必须检查 mysql 服务器二进制文件是否已编译为支持它 mys
  • 关于mysql建表的几个问题

    CREATE TABLE favorite food person id SMALLINT UNSIGNED food VARCHAR 20 CONSTRAINT pk favorite food PRIMARY KEY person id
  • 如何从java中的字符串时间戳中提取日期和时间

    我正在获取日期和时间String TIMESTAMP来自服务器的 MySQL 格式如下 2014 02 15 05 18 08 我想要的是提取日期DD MM YYYY格式和时间HH MM SS AM PM格式 而且这个时间戳的时区是不同的
  • 将 .NET 小数存储到 MySQL 中的最佳字段定义是什么?

    我需要将小数存储到 MySQL 中 它可以具有不同的精度 因此我很想知道哪种 MySQL 字段类型绝对等同于 NET 的字段类型decimal http msdn microsoft com en us library system dec
  • 多人/单人测验游戏的数据库设计

    我在这里看到了很多问题 但没有人适合我的问题 我正在尝试创建一个可扩展的 ER 模型 如果我想添加更多数据 则不会破坏几乎任何东西 所以我尝试创建的是 有两种类型的用户 比如说管理员和工作人员 他们有不同的角色 管理员可以对问题进行 CRU
  • MySQL 将日期时间转换为unix时间?

    我有一个 DATETIME 格式的列 我想将其转换为数据库中的 UNIXTIME 那会是什么样的查询 我知道如何从 UNIXTIME 转换为 DATETIME 但我从未做过相反的操作 我用过FROM UNIXTIME 没有TO UNIXTI
  • Session_set_save_handler 未设置

    我在设置 session set save handler 时遇到问题 我将 php ini 配置为 session handler user 这个简单的测试失败了 Define custom session handler if sess
  • 使用 MediaWiki API 下载图像?

    是否可以使用 MediaWiki API 从维基百科下载图像 不 无法通过 API 获取图像 MediaWiki 中的图像仅存储在文件夹中 而不是存储在数据库中 并且不会动态传递 更多信息请参见手册 图像管理 http www mediaw

随机推荐

  • 更改 ComboBox 项目的格式

    是否可以在 C 中格式化 ComboBox 项 例如 如何将某个项目设为粗体 更改其文本的颜色等 尽管这篇文章很老 我发现它作为搜索的起点很有用 但最终使用所示的方法得到了更好的结果here由 保罗 这是我用来有条件地使组合框中的项目显示为
  • 如何为 httpclient getasync 方法创建模拟?

    我正在使用 Moq 为单元测试创 建模拟 但是当我必须为 httpclient 的 getasync 方法创建模拟时 我陷入了困境 以前我使用 SendAsync 方法 为此我可以使用以下代码 var mockResponse new Ht
  • 从word文档中提取标题文本

    我正在尝试提取text来自 MS Word 文档 docx 文件 中的 任何级别 标题 目前我正在尝试解决使用python docx 但不幸的是 读完后我仍然无法弄清楚它是否可行 也许我错了 我尝试在网上寻找解决方案 但没有发现任何适合我的
  • 我可以替换或修改 jQuery UI 小部件上的函数吗?如何? (猴子补丁)

    如果我想通过替换其中一个函数来调整 jQuery UI 对象的某些功能 我该怎么做呢 示例 假设我想修改 jQuery 自动完成小部件呈现建议的方式 自动完成对象上有一个方法 如下所示 renderItem function ul item
  • 如何使用 scikit-learn 评估预测的置信度得分

    我写下了一个简单的代码 它采用一个参数 query seq 进一步的方法计算描述符 最后可以使用 LogisticRegression 或该函数提供的任何其他算法 算法作为 0 给定情况为负 进行预测 或 1 给定情况为正 def main
  • 从 NSArray 中检索 NSDictionary,其中字典键的值为 X

    我有一个NSArray with NSDictionaries 数组之一中的字典键之一包含一个值 我想找回NSDictionary具有该值 我的阵列 Array DisplayName level InternalName Number 2
  • 如何在 podfile 中为 Xcode 项目指定多个目标?

    我在 Xcode 4 项目中使用 CocoaPods 我的项目有三个目标 默认目标 一个用于构建精简版本 一个用于构建演示版本 所有目标都使用相同的库 但 CocoaPods 仅将静态库和搜索路径添加到主要目标 我的 podfile 看起来
  • R 中的动态 selectInput 闪亮

    我有 3 个 selectInput 框和一组 4 个选项 可以通过这 3 个框进行选择 我希望 selectInputs 显示的选项在选择其他 selectInputs 时动态更改 不过 我希望所有三个框在任何时间点都可以使用 无 选项
  • Javascript 对象属性是否按顺序分配?

    假设我有一个对象 它根据函数的返回值分配属性 var i 0 var f function return i var foo a f b f c f 是否保证 foo a 为 1 foo b 为 2 foo c 为 3 我知道 JS 不保证
  • Python Paramiko(客户端)多重身份验证

    我正在尝试使用 Paramiko 在 Python 2 7 上 连接到使用多重身份验证 用户名 密码 一次性密码 的主机 这transport auth interactive函数似乎是执行此操作的方法 根据我从文档中理解的内容 但执行从未
  • 对 .net 混淆代码进行逆向工程有多容易?

    市场上有一些程序可以用来混淆您的 net 代码 我的问题是 如果您的代码被 所谓 混淆了 那么别人获取您的 IP 有多容易 混淆 net 代码仅仅是橡皮鸡安全吗 或者说它足以真正保护您的知识产权吗 混淆就像门锁 它让诚实的人保持诚实
  • 插入值语句只能包含 SQL 数据仓库中的常量文字值或变量引用

    考虑这个表 CREATE TABLE t i int j int 我想将一组数据插入到表中SELECT声明 我的查询的简化版本是 INSERT INTO t VALUES SELECT 1 SELECT 2 真正的查询可能要复杂得多 并且各
  • 如何计算Spark结构化流中的滞后差?

    我正在编写 Spark 结构化流程序 我需要创建一个具有滞后差的附加列 为了重现我的问题 我提供了代码片段 这段代码消耗data json文件存储在data folder id 77 type person timestamp 153260
  • 由于覆盖而无法单击按钮?

    这是 HTML li class navs a class Navigation href http youtube com YouTube a li 这是CSS navs after content position absolute t
  • g++:用闭包类型初始化的 std::function 总是使用堆分配?

    互联网上的一些资源 特别是this one 表示 std function 使用小闭包优化 例如如果闭包大小低于一定数量的数据 它不会分配堆 上面的链接指示 gcc 为 16 字节 所以我开始挖掘 g 头文件 看起来是否应用这种优化是由 功
  • 扩展 Django 中的用户配置文件。管理员创建用户

    晚上好 我目前正在使用 Django 创建一个网站 并使用用户配置文件扩展了用户 不过我有一个小问题 这是我的情况 我扩展了用户配置文件以添加自定义字段 我将模型添加到用户管理模型中 因此当我添加用户时 我可以直接填写字段来创建配置文件 现
  • 读取 Excel 文件 (.xls/.xlsx) 的最佳方式

    我知道读取 Excel 文件有不同的方法 Iterop Oledb Open Xml SDK 兼容性不是问题 因为程序将在受控环境中执行 我的要求 将文件读取到DataTable CUstom Entities 我不知道如何为对象创建动态属
  • 关于 SDL_Window 和 unique_ptr 的几个问题

    我目前在将 SDL Window 指针存储为 std unique ptr 时遇到问题 我尝试的是 std unique ptr
  • java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()

    我有一个使用 spring hibernate 3 6 4 GWT 2 3 drools 的 Maven 项目 一切都工作正常 直到我开始使用休眠 OneToMany ManyToMany 关系 当我从 mvn jetty run 运行应用
  • 如何在 MediaWiki 数据库中进行重音和不区分大小写的搜索?

    假设我的 wiki MediaWiki 1 19 4 中有这些页面标题 SOMETHIng S meth ng Som th ng S metH nG 如果用户搜索something我希望所有 4 页都作为结果返回 目前我唯一能想到的是这个