10

英語と中国語の単一の列にデータが保存されています。

データは区切り文字で区切られています。たとえば、中国語の場合です。

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

英語用

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

ユーザーが選択した言語に従ってコンテンツを表示します。

このようなクエリを作成しました

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

上記のクエリは機能しますが、空の結果セットが返されます。

Collationcontent列はutf8_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<!--:-->

に続く

英語と中国語のデータを1列に保存しています

選択したものは次のようになります

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」と「hhOo」は似ていますが、文字のコードポイントが異なるため、勝ちました。同等と比較しないでください。全幅で何かをタイプミスするのは非常に簡単で、特に空白の場合、検出するのは非常に困難です。「」と「」を比較してください。

おそらく、データを半分の幅で保存し、それを全幅でクエリしています。1つの文字が異なっていても(特にスペースを検出するのは難しい)、クエリは目的のデータを見つけられません。

これを検出する方法はたくさんあります。たとえば、データとクエリをテキストファイルに逐語的にコピーして、16進エディタで表示してみてください。関連する部分に1ビットの違いがある場合は、この問題に対処している可能性があります。

于 2012-12-14T14:39:52.317 に答える
2

データの保存方法が原因で検索が失敗します。utf8_general_ci照合を使用しています。これは、一部のヨーロッパ言語での高速検索に合わせて調整されています。それらのいくつかではそれほど完璧ではありません。人々はそれが速いという理由だけでそれを使う傾向があり、彼らは例えばスカンジナビア語での検索の不正確さを気にしません。これをbig5_chinese_ciまたは他の中国語の調整された照合に変更します。

UPD。別物。なるほど、DBレコードで一種のマークアップを使用しています。

<!--: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 でワイルドカードを使用できます。

  • % は、ゼロ文字を含む任意の数の文字に一致します。
  • _ は正確に 1 文字に一致します

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 に答える