当前位置: 首页 > 知识库问答 >
问题:

MySQL与0结果的匹配在MyISAM中,但在创新数据库上工作

濮宇定
2023-03-14

我有这张桌子

CREATE TABLE `tbl` (
  `id` bigint(20) NOT NULL,
  `code` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE `tbl` ADD PRIMARY KEY (`id`);
ALTER TABLE `tbl` ADD FULLTEXT KEY `code` (`code`);

INSERT INTO `tbl` (`id`, `code`) VALUES (1, '110.103');

这是我的查询

SELECT code FROM `tbl` WHERE (MATCH (code) AGAINST ('110.103*' IN BOOLEAN MODE) ) 

但是没有结果。有什么想法吗?

共有3个答案

夏侯弘光
2023-03-14

MySQL不允许使用整数值或双精度值。用于全文搜索

朱睿
2023-03-14

尝试:“110.103”*否则它会忽略“句点”。

田权
2023-03-14

首先,全文索引存储单词。例如,单词由句点分隔 - 实际上任何不是字母,数字,下划线或单个撇号的东西。因此,您的文本目前由两个单词组成,“101”和“103”。

MySQL全文索引将仅存储具有最小字长的单词。MyISAM使用4作为ft_min_word_len的默认值,因此不包括您的3位“单词”,而InnodB使用3作为innodb_ft_min_token_size,这就是它们被包括在内的原因。更改这些设置(并重建您的索引),两个引擎将找到相同的行。

话虽如此:匹配(代码)反对(在布尔模式下为“110.103 *”)仍将搜索单词。它将找到任何包含“单词”110 或(!) 以 103 开头的单词的行。您可以强制将这两个单词都设置为(在布尔模式下为' 110 103*'),但它们可以按任意顺序排列。如果您使用反对(“110 103”'),则可以强制执行特定命令,但不再支持*

一个常见的技巧是用下划线< code>110_103存储您的数字(并以这种方式搜索),然后这就是一个完整的单词。例如,您可以通过添加一个< code > code _ search -列来完成此操作,您可以使用触发器(或将其定义为生成的列)来保持更新,并在该列中进行搜索。如果您的代码也可以包含< code>_,则它不会区分< code>_和< code >。了,所以您必须添加一个附加条件(< code >...where match (code_search)与(...)和类似“...”的代码)或类似的东西)。

但我不确定你是否真的需要在这里进行全文搜索。如果您的列实际上只包含单个代码(而不是包含多个单独单词的文本,这是全文索引的用例),则可能需要尝试使用“101.103%”等代码“1.103%”或“101.103%”或代码(如“%101.103%”)的位置,具体取决于您要查找的确切内容。为此添加一个(正常)索引,至少第一次搜索将比全文搜索更快(除了与全文搜索相比,它将为您提供所需的结果)。

尽管我怀疑这里的情况是否如此:如果你真的在寻找浮点数,如果你能把它们作为实际数字存储在一个单独的列中(或者如果数据每行包含多个浮点数,则为单独的表),你的生活会容易得多。

 类似资料:
  • 我已经安装了Python版本3.4。0,我想用MySQL数据库做一个项目。我下载并尝试安装MySQLdb,但在这个版本的Python中没有成功。 有什么建议可以帮助我解决这个问题并正确安装吗?

  • 本文向大家介绍MySQL数据库表修复 MyISAM,包括了MySQL数据库表修复 MyISAM的使用技巧和注意事项,需要的朋友参考一下 一:MySQL中MyISAM表损坏原因总结: 1、 服务器突然断电导致数据文件损坏;强制关机,没有先关闭mysql 服务;mysqld 进程在写表时被杀掉。 2、 磁盘损坏。 3、 服务器死机。 4、 mysql 本身的bug 。 二:MySQL中MyISAM表损

  • 问题内容: 我编写了一个查询,返回了将 Customer和Salespeoeple 关联的行。 请注意,查询将联接多个数据库表。请注意,并非所有客户都有销售人员。 我的数据库中也只有一个表(称为 发票 ),如下所示。 如何在MySQL中使用UPDATE来使我的发票表看起来像下面的表? 也就是说,如何在存在这种关系的地方更新发票表以包含正确的salesperson_id和salesperson_na

  • 问题内容: 我正在使用MySQL。我有一个名为EMP的表,现在我需要再创建一个具有相同架构,相同列和相同约束的表(EMP_TWO)。我怎样才能做到这一点? 问题答案: 要基于其他表结构/约束创建新表,请使用: 要跨多个数据复制,请使用 创建表格文档 当心关于LIKE选项的注意事项: 使用LIKE根据另一个表的定义(包括原始表中定义的任何列属性和索引)创建一个空表: CREATE TABLE new

  • 我正试图按月份对当前年度的数据进行分组。下面的查询适用于MySQL数据库,但当连接到PostgreSQL时会出现错误。 生成了此错误:

  • 问题内容: 您能帮忙解决这个问题吗? 我正在尝试创建然后使用一个名为TIGER的数据库。 如果我在MySQL中创建数据库并且运行完美,我没有问题。 我想做的是从Java创建它。这样,当首次运行代码时,它将在初始启动过程中创建数据库。如果可能的话,我想用一种干净的方法将其装箱。 有人可以告诉我您实际将代码放置在哪里 这是代码 这是创建数据库的代码 在此先感谢,感谢您的帮助。 因为我是一个长期读者但还