【问题标题】:string querying with space in mysql using Perl使用Perl在mysql中使用空格进行字符串查询
【发布时间】:2012-01-19 00:05:58
【问题描述】:

我认为这个问题是针对 php 提出的,现在我针对 perl 提出了这个问题。我有 2 个数组。我正在使用它来查询我的数据库。现在碰巧这些术语不仅仅是一个单词,因此其中可能有空格。

我声明了 2 个变量,比如 $foo 和 $bar。我有 2 个 for 循环将文件 1 中的每个术语组合到文件 2 中的每个术语并查询数据库。每次每个术语都进入变量。数据库是文本索引的。我正在使用 DBI 模块。我的查询是这样的:

my $query_handle = $connect->prepare("SELECT value FROM value_table WHERE
MATCH(column_text_indexed) AGAINST ('+"$foo" +"$bar"' in boolean mode)") || die 
"Prepare failed:$DBI::errstr\n";

它给出了以下错误:

Scalar found where operator expected at program.pl line 32, near ""SELECT value FROM value_table
WHERE MATCH(column_text_indexed) AGAINST ('+"$foo"
        (Missing operator before $foo?)
String found where operator expected at program.pl line 32, near "$foo" +""
    (Missing operator before " +"?)
Scalar found where operator expected at program.pl line 32, near "" +"$bar"
    (Missing operator before $bar?)
String found where operator expected at program.pl line 32, near "$bar"' in boolean mode)""
    (Missing operator before "' in boolean mode)"?)
syntax error at program.pl line 32, near ""SELECT value FROM value_table WHERE
MATCH(column_text_indexed) against ('+"$foo"
Execution of program.pl aborted due to compilation errors.

另外,我的另一个顾虑是:当术语“81-α-羟化酶缺乏”或“26-脱氧类固醇活性稳定”时,在术语周围使用引号是否正确?根据http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html,如果要搜索确切的术语并且我希望搜索确切的术语,则使用引号。当我使用 () 时,我会得到结果,但后来我认为它会将由空格分隔的整个单词视为不同的单词,并为其中任何一个单词提供结果。

非常感谢任何帮助。

谢谢。

【问题讨论】:

    标签: mysql perl full-text-search dbi


    【解决方案1】:

    抱歉,我不知道你到底需要什么 SQL,但你可以使用 qq{} 编写它:

    my $query_handle = $connect->prepare(qq{
    SELECT value
    FROM value_table
    WHERE
        MATCH(column_text_indexed) AGAINST ('+$foo +$bar' in boolean mode)
    }) || die "Prepare failed:$DBI::errstr\n";
    

    另外(我不确定 AGAINST 部分中的占位符):您应该始终使用占位符

    【讨论】:

      【解决方案2】:

      在双引号字符串中,您不需要将标量变量放在外面,因为它们会插入到字符串中。也不太清楚你在这里做什么,因为+ 不是你在 perl 中连接字符串的方式,你使用. 来做到这一点。 + 用于添加。

      "SELECT value FROM value_table WHERE
      MATCH(column_text_indexed) AGAINST ('$foo $bar' in boolean mode)"
      

      如果您打算在字符串中包含这些引号,请改用qq(),因为" 将是双引号字符串中的元字符:

      qq|SELECT value FROM value_table WHERE
      MATCH(column_text_indexed) AGAINST ('+"$foo" +"$bar"' in boolean mode)|
      

      请注意,qq() 可以使用除() 之外的其他分隔符,在本例中为|

      请注意,您应该改用占位符,正如其他人提到的那样。

      【讨论】:

      • 感谢您的回答。好吧,这里的 + 用作 AND。所以查询是在包含这两个术语的数据库中找到这样的文本。如果您可以转到查询全文索引数据库的链接,这就是他们所说的。
      【解决方案3】:

      假设你要创建字符串

      +"foo" +"bar"
      

      (是的,我现在忽略插值。)

      您不能只将整个内容放在双引号中,因为字符串文字将在遇到的第一个双引号处结束。您还需要转义现有的双引号(以及双引号字符串中的任何其他特殊字符)。

      "+\"foo\" +\"bar\""
      

      或者,您可以使用不同的分隔符,例如

      qq!+"foo" +"bar"!
      

      qq{+"foo" +"bar"}
      

      现在让我们插入我们真正想要的值。

      qq{+"$foo" +"$bar"}
      

      大家一起:

      my $sth = $dbh->prepare(qq{
         SELECT value
           FROM value_table
          WHERE MATCH (column_text_indexed) AGAINST (? IN BOOLEAN MODE)
      });
      
      $sth->execute(qq{+"$foo" +"$bar"});
      

      注意占位符的使用!始终使用占位符。 (如果您还不知道,请在 DBI 文档中搜索该词。)如果 $foo$bar 包含双引号或其他奇怪的字符,您的数据不会被意外地解释为代码。

      【讨论】:

        猜你喜欢
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多