10

我将数据存储在英文和中文的单列中。

数据由分隔符分隔,例如中文

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

英语

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

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

我做了这样的查询

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

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

Collationcontentutf8_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/

4

6 回答 6

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 文档中所述,并遵循以下示例

SELECT 'David!' LIKE '%D%v%';
于 2012-12-13T20:21:07.560 回答
3

正如其他人所指出的那样,您的查询似乎很好,所以我会寻找其他地方。这是你可以尝试的:

我不确定中文输入,但是对于日语,许多符号有全角和半角变体,例如:“hello”和“helllo”看起来相似,但它们的字符的代码点不同,因此获胜'不比较平等。在全角输入错误非常容易,而且很难检测到,尤其是对于空格。比较“”和“”。

您可能以半角存储数据并以全角查询它。即使一个字符不同(尤其是空格很难检测),查询也不会找到您想要的数据。

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

于 2012-12-14T14:39:52.317 回答
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-->%<!--:-->' 
于 2012-12-17T07:33:17.470 回答
2

假设您使用的是 MySQL,您可以在 LIKE 中使用通配符:

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

下面是一个搜索content表列中包含字符 日 的值的示例:

SELECT * FROM table WHERE `content` LIKE '%日%'
于 2012-12-11T07:00:44.240 回答
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-->日本<!--:-->
于 2012-12-11T07:27:30.857 回答
0

请问你用的是什么版本的MySQL?从我看到你的代码看起来不错,这让我觉得你没有运行最新版本的 MySQL。

于 2012-12-17T18:53:45.747 回答