3

通常、多くの特殊文字で構成されるポーランドの都市をデータベースで検索したいと考えています。それらをASCIIに移行して、洗練されたキーボードを持っていない人でも通常の検索ができるようにしたい.

PHPでは次のようになります

$ascii = iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", $text);

しかし、mysql select クエリでそれを実装する方法は?

select * from city where CONVERT(city using ASCII)=CONVERT(? using ASCII)

すべての不明な文字を疑問符に置き換えるため、機能しません

select CONVERT('Lódź' using ascii );
-- RESULT: L?d?
4

3 に答える 3

1

この回答で説明されているように、 collat​​ion を使用するとutf8_general_ci、文字列の比較で大文字と小文字が区別されず、アクセントが区別されないため、クエリを実行するときに変換を指定する必要はありません。

CREATE TABLE test (name varchar(100)) COLLATE 'utf8_general_ci';
INSERT test (name) VALUES ('Lódź');

SELECT * FROM test WHERE name = 'Lodz';

name
----
Lódź

ここでフィドル

また、列に別の照合を指定する場合は、特定のクエリでこの照合を適用することもできます。

CREATE TABLE test (name varchar(100)) COLLATE 'utf8_polish_ci';
INSERT test (name) VALUES ('Lódź');


SELECT * FROM test WHERE name = 'Lodz';

Empty set (0.00 sec)


SELECT * FROM test WHERE name COLLATE 'utf8_general_ci' = 'Lodz';

name
----
Lódź

ここで2番目のフィドル

于 2013-09-30T13:07:07.300 に答える
1

オペレーターの行動

等しい演算子=

等号演算子=を使用して正確な検索を行っている場合、ソリューション@rsanchezは正しいです。たとえば、次の正確な値またはその翻字された値を使用して、等しい行œを見つけることができます。œoe

SELECT 'œ' = 'oe' COLLATE utf8_unicode_ci ;
-- true
+-------------------------------------+
| 'œ' = 'oe' COLLATE utf8_unicode_ci  |
+-------------------------------------+
|                                   1 |
+-------------------------------------+

等しい行、œまたはoeユーザーがそれらのいずれかを使用する場合に行を返します。

LIKEオペレーター

LIKEただし、 operatorを使用してあいまい検索を行いたい場合、これは機能しません。たとえば、入力して を含む単語を検索しても、 を含むœoe返されませんœ

SELECT 'œ' LIKE 'oe' COLLATE utf8_unicode_ci ;
-- false
+----------------------------------------+
| 'œ' LIKE 'oe' COLLATE utf8_unicode_ci  |
+----------------------------------------+
|                                      0 |
+----------------------------------------+

説明 ?

これはバグではありませんが、SQL 標準 (Alexander Barkov の回答を参照) によって予想される動作であり、より複雑なアプローチを使用しLIKEながら文字ベースで比較を行います (例: 音訳の同等性を許可する)。=

ソリューション

音訳されたフォームを提供する

解決策は、検索の音訳を生成し、クエリを変更して各フォームを検索することです。

SELECT * FROM `mytable` 
  WHERE `myfield` LIKE 'oe' or `myfield` LIKE 'oe' 
COLLATE  utf8_unicode_ci;

全文検索を使用する

MySQL 5.6以降、全文検索がInnoDB で利用できるようになりました (以前はMyISAMテーブルでのみ利用可能でした)。

于 2014-03-06T12:10:51.633 に答える