Mysql Select with LIKE子句不能正常工作

时间:2012-11-21 11:34:51

标签: mysql select

我将数据存储在单列中,使用英文和中文。

数据由分隔符分隔,例如 对于中国人

<!--:zh-->日本<!--:-->

for English

<!--:en-->English Characters<!--:-->

我会根据用户选择的语言显示内容。

我这样做了一个查询

SELECT * FROM table WHERE content LIKE '<!--:zh-->%<!--:-->' 

上面的查询有效,但返回空结果集。

Collation列的

contentutf8_general_ci

我也尝试使用convert功能,如下所示

SELECT * FROM table WHERE CONVERT(content USING utf8) 
                           LIKE CONVERT('<!--:zh-->%<!--:-->' USING utf8)

但这也行不通。

我也尝试过运行查询SET NAMES UTF8,但它仍无效。

我在PhpMyAdmin中运行查询,如果它确实重要。


qTranslate没有更改WordPress使用的数据库。翻译数据存储在原始字段中。因此,每个字段都包含该特殊字段的所有翻译,数据就像这样

<!--:en-->English Characters<!--:--><!--:zh-->日本<!--:-->

http://wpml.org/documentation/related-projects/qtranslate-importer/

6 个答案:

答案 0 :(得分:4)

内容的测试表数据

<!--:zh-->日本<!--:--><!--:en-->English Characters<!--:-->
<!--:en-->English Characters<!--:--><!--:zh-->日本<!--:-->
<!--:zh-->日本<!--:-->
<!--:en-->English Characters<!--:-->

接着是

  

我的数据存储在单列中,这些数据是英文和   中国

你的选择应该是这样的

SELECT * FROM tab
WHERE content LIKE '%<!--:zh-->%<!--:-->%'

SQL Fiddle DEMO(还有演示如何从内容中获取特殊语言部分)

SET @PRE = '<!--:zh-->', @SUF = '<!--:-->';

SELECT
  content,
  SUBSTR( 
    content, 
    LOCATE( @PRE, content ) + LENGTH( @PRE ), 
    LOCATE( @SUF, content, LOCATE( @PRE, content ) ) - LOCATE( @PRE, content ) - LENGTH( @PRE ) 
  ) langcontent
FROM tab
WHERE content LIKE CONCAT( '%', @PRE, '%', @SUF, '%' );

MySQL Documentation中所述,并按照

的示例进行操作
SELECT 'David!' LIKE '%D%v%';

答案 1 :(得分:3)

正如其他人所指出的那样,你的查询似乎没问题,所以我会把目光投向其他地方。这是你可以尝试的:

我不确定中文输入,但对于日语,许多符号都有全宽和半宽变体,例如:“hello”和“hello”看起来很相似,但是它们的字符代码点不同,因此不会相等。很容易输入全宽的内容,并且非常难以检测,尤其是用于空格。比较“”和“”。

您可能以半宽存储数据并以全宽查询数据。即使一个字符不同(特别是空格难以检测),查询也无法找到您想要的数据。

有很多方法可以检测到这种情况,例如尝试逐字复制数据和查询文本文件,并使用十六进制编辑器查看它们。如果相关部分中存在单个位差异,则可能是在处理此问题。

答案 2 :(得分:2)

假设你正在使用MySQL,你可以在LIKE中使用通配符:

  • %匹配任意数量的字符,包括零个字符。
  • _只匹配一个字符

以下是搜索表格content列中包含字符日的值的示例:

SELECT * FROM table WHERE `content` LIKE '%日%'

答案 3 :(得分:2)

我试图重现这个问题。查询没问题,即使使用SET NAMES latin1,我也得到了结果。

检查字段的内容,可能有开头/结尾的空格,先删除它们,或尝试此查询 -

SELECT * FROM table
WHERE TRIM(content) LIKE '<!--:zh-->%<!--:-->'

您的字符串示例 -

CREATE TABLE table1(
  column1 VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci
);

INSERT INTO table1 VALUES
  ('<!--:en-->English Characters<!--:--><!--:zh-->日本<!--:-->');

SELECT * FROM table1 WHERE column1 LIKE '%<!--:zh-->%<!--:-->';

=>  <!--:en-->English Characters<!--:--><!--:zh-->日本<!--:-->

答案 4 :(得分:2)

由于您存储数据的方式,搜索失败。 您正在使用utf8_general_ci排序规则,该排序规则适用于某些欧洲语言的快速搜索。它们中的一些甚至不是那么完美。人们倾向于使用它只是因为它很快并且他们不关心斯堪的纳维亚语言中的一些搜索不准确性。 将此更改为big5_chinese_ci或其他一些中文调整校对。

UPD。 另一件事。 我明白了,你在数据库记录中使用了一种标记。

<!--:zh-->日本<!--:-->
<!--:en-->English Characters<!--:-->

所以,如果你正在搜索中文,你可以使用

SELECT * FROM table WHERE content LIKE '<!--:zh-->%' 

而不是

SELECT * FROM table WHERE content LIKE '<!--:zh-->%<!--:-->' 

答案 5 :(得分:0)

我可以问您正在使用的MySQL版本是什么?从我看到你的代码似乎很好,这让我觉得你没有运行最新版本的MySQL。