序文最近、私は小さな個人ブログ プロジェクトを書くのに忙しくしています。 「グローバル検索」機能を実装しているときに、MySQL のあいまいクエリ ステートメントが少し魔法のようであることに気付きました (プログラミング段階に入ったばかりなので、笑わせるかもしれません、ハハハ)。MySQLのあいまいクエリ ステートメントは大文字と小文字を区別する場合もあれば、大文字と小文字を区別しない場合もあります。そこで、多くの実験を行い、次の結論に達しました (間違いがある可能性があります。私の欠点を指摘していただければ幸いです。また、一緒に問題について話し合う友人を歓迎します)。 まず COLLATE を紹介します。COLLATE は通常、データ エンコーディング (CHARSET) に関連しています。一般的に、各 CHARSET は複数の COLLATE をサポートしており、各 CHARSET はデフォルト値として COLLATE を指定します。たとえば、 latin1エンコーディングのデフォルトの COLLATE はlatin1_swedish_ci 、 gbkエンコーディングのデフォルトの COLLATE はgbk_chinese_ci 、 utf8mb4エンコーディングのデフォルトの COLLATE はutf8mb4_general_ciです。
興味のある方は、Navicate などのデータベース視覚化ツールで自分で試すことができます。 注意: MySQL にはutf8とutf8mb4 の2 つのエンコーディングがあります。ただし、MySQL の utf8 は、最大 3 バイトの長さの文字エンコーディングのみをサポートします。したがって、utf8mb4 エンコーディング形式を選択することをお勧めします。 解決策1図に示すように、区別を容易にし、友人が理解しやすいように、ここでは 2 つの同一のデータベースを作成しました。1 つはutf8エンコード形式を使用し、もう 1 つはutf8mb4形式を使用します。 大文字と小文字を区別 テーブル作成ステートメントでも、 utf8エンコード形式が使用されます。 テーブルステートメントの作成 blog_test : utf8 エンコード形式 名前をutf8に設定します。 FOREIGN_KEY_CHECKS = 0 を設定します。 -- ---------------------------- -- t_blog のテーブル構造 -- ---------------------------- `t_blog` が存在する場合はテーブルを削除します。 テーブル `t_blog` を作成します ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `appreciation` ビット(1) NOT NULL、 `comment_tabled` ビット(1) NOT NULL、 `content` 長文文字セット utf8 COLLATE utf8_bin NULL, `create_time` datetime(0) NULL デフォルト NULL, `first_picture` varchar(255) 文字セット utf8 COLLATE utf8_bin NULL デフォルト NULL, `flag` varchar(255) 文字セット utf8 COLLATE utf8_bin NULL デフォルト NULL, `published` ビット(1) NOT NULL、 `recommend` ビット(1) NOT NULL、 `share_statement` ビット(1) NOT NULL、 `title` varchar(255) 文字セット utf8 COLLATE utf8_bin NULL デフォルト NULL, `update_time` datetime(0) NULL デフォルト NULL, `views` int(11) NULL デフォルト NULL, `type_id` bigint(20) NULL デフォルト NULL, `user_id` bigint(20) NULL デフォルト NULL, `description` varchar(255) 文字セット utf8 COLLATE utf8_bin NULL デフォルト NULL, BTREEを使用した主キー(`id`) インデックス `FK292449gwg5yf7ocdlmswv9w4j`(`type_id`) BTREE を使用、 インデックス `FK8ky5rrsxh01nkhctmo7d48p82`(`user_id`) BTREE を使用、 制約 `FK292449gwg5yf7ocdlmswv9w4j` 外部キー (`type_id`) 参照 `t_type` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT、 制約 `FK8ky5rrsxh01nkhctmo7d48p82` 外部キー (`user_id`) 参照 `t_user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; データベースの内容 クエリ結果 select * from '%HTML%' のような 結論は: MySQLはutf8エンコード形式を使用し、あいまいクエリは大文字と小文字を区別します。 大文字と小文字を区別しない テーブルステートメントの作成 テーブル作成ステートメントでも、 utf8mb4エンコード形式が使用されます。 blog_test2: utf8mb4 エンコード形式 名前を設定します utf8mb4; FOREIGN_KEY_CHECKS = 0 を設定します。 -- ---------------------------- -- t_blog のテーブル構造 -- ---------------------------- `t_blog` が存在する場合はテーブルを削除します。 テーブル `t_blog` を作成します ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `appreciation` ビット(1) NOT NULL、 `comment_tabled` ビット(1) NOT NULL、 `content` 長文文字セット utf8mb4 COLLATE utf8mb4_general_ci NULL, `create_time` datetime(0) NULL デフォルト NULL, `first_picture` varchar(255) 文字セット utf8mb4 COLLATE utf8mb4_general_ci NULL デフォルト NULL, `flag` varchar(255) 文字セット utf8mb4 COLLATE utf8mb4_general_ci NULL デフォルト NULL, `published` ビット(1) NOT NULL、 `recommend` ビット(1) NOT NULL、 `share_statement` ビット(1) NOT NULL、 `title` varchar(255) 文字セット utf8mb4 COLLATE utf8mb4_general_ci NULL デフォルト NULL, `update_time` datetime(0) NULL デフォルト NULL, `views` int(11) NULL デフォルト NULL, `type_id` bigint(20) NULL デフォルト NULL, `user_id` bigint(20) NULL デフォルト NULL, `description` varchar(255) 文字セット utf8mb4 COLLATE utf8mb4_general_ci NULL デフォルト NULL, BTREEを使用した主キー(`id`) インデックス `FK292449gwg5yf7ocdlmswv9w4j`(`type_id`) BTREE を使用、 インデックス `FK8ky5rrsxh01nkhctmo7d48p82`(`user_id`) BTREE を使用、 制約 `FK292449gwg5yf7ocdlmswv9w4j` 外部キー (`type_id`) 参照 `t_type` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT、 制約 `FK8ky5rrsxh01nkhctmo7d48p82` 外部キー (`user_id`) 参照 `t_user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; データベースの内容 クエリ結果 select * from
* 結論は MySQLはutf8mb4エンコード形式を使用し、あいまいクエリでは大文字と小文字は区別されません。 解決策2大文字と小文字を区別 方法 必要なフィールドを個別に指定します (たとえば、ここで大文字と小文字を区別する必要があるフィールドは、't_blog' テーブルの 'title' フィールドです)。エンコード形式は 'utf8' とし、COLLATE は "utf8_bin" とします。 alter table t_blog CHANGE `title` `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL; 結論は '%HTML%' のような '%html%' のような 上記の実行結果から、このメソッドにより、あいまいクエリ ステートメントの大文字と小文字を区別できることがわかります。 大文字と小文字を区別しない 方法 必要なフィールドを個別に指定します (たとえば、ここで大文字と小文字を区別しない必要があるフィールドは、テーブル 't_blog' の 'title' フィールドです)。エンコード形式は 'utf8mb4' とし、COLLATE は "utf8mb4_bin" とします。 alter table t_blog CHANGE `title` `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL; 結論 select * from '%html%' のような 上記の実行結果から、このメソッドにより、あいまいクエリ ステートメントの大文字と小文字を区別しないことができることがわかります。 解決策3大文字と小文字を区別 方法 図に示すように、現在の「t_blog」テーブルの「title」フィールドのCOLLATEは「utf8mb4_general_ci」であり、大文字と小文字は区別されません。 フィールドを BINARY に変更します。 alter table t_blog CHANGE `title` `title` varchar(255) BINARY NULL DEFAULT NULL; テーブル `t_blog` を変更し、列 `title` varchar(255) BINARY NULL DEFAULT NULL を変更します。 2 つの変更方法のいずれかを選択します。 結論は '%HTML%' のような '%html%' のような 上記の実行結果から、フィールドを BINARY に変更すると、ファジー クエリ ステートメントで大文字と小文字が区別されることがわかります。 解決策4大文字と小文字を区別 方法 図に示すように、現在の「t_blog」テーブルの「title」フィールドのCOLLATEは「utf8mb4_general_ci」であり、大文字と小文字は区別されません。 クエリ ステートメント フィールドの前に BINARY を追加します。 select * from `t_blog` where BINARY `title` like '%html%'; 結論は '%html%' のような select * from 上記の実行結果から、クエリ ステートメント フィールドの前に BINARY を追加すると、ファジー クエリ ステートメントで大文字と小文字が区別されることがわかります。 解決策5(特に推奨されませんので、使用しないようにしてください) 対応する MySQL バージョンのmy.iniファイルを見つけます。この初心者の場合、バージョン 8.0.17 に相当します。
小文字テーブル名=1 注: 0: 大文字と小文字を区別する、1: 大文字と小文字を区別しない MySQLを再起動する まだまだ説明が足りないところも多いので、専門家の方にアドバイスを頂きたいです!もっと詳しく知りたい場合は、ボスのブログを参照してください(崇拝)mysqlは大文字と小文字を区別します 要約するMySQL ファジークエリが大文字と小文字を区別するかどうかについてのこの記事はこれで終わりです。MySQL ファジークエリの大文字と小文字の区別の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Linux の高性能ネットワーク IO と Reactor モデルの分析
>>: HTML ハイパーリンク スタイル (4 つの異なる状態) の設定例
1. 建設1. htpasswd.txtファイルを準備するファイルには、パッケージを倉庫にアップロー...
1. データを準備するこのテーブルでは次の操作が実行されます 学生テーブルを作成 ( id int ...
前回の記事では、Zabbix のパッシブ、アクティブ、Web 監視に関するトピックについて学習しまし...
1つ。 Mysql Binlog フォーマットの紹介 Mysql binlog ログには、State...
目次概要マップされた型を使用して Object.freeze() を構築するマッピングタイプの構文は...
最初は悲しい気持ちになりました。スクリーンショットは以下の通りです。 少し苦労しましたが、解決策は次...
MySQL のデータ ディクショナリは、データベースの重要なコンポーネントの 1 つです。INFOR...
Linux システム時間には 2 種類あります。 (1)暦上の時刻。値は、指定された時刻、1970 ...
1. IEブラウザを使用してVPNにログインする 2. リモートログイン 3. サーバーに最新のn...
成果を達成するコードは次のとおりですhtml <テンプレート> <div> ...
Apache Tika は、さまざまな形式のファイルからファイル タイプを検出し、コンテンツを抽出す...
1 はじめにRedis 、 ANSI C言語で開発されたKey-Valueベースの高性能NoSQLデ...
遅いログクエリ機能スロー ログ クエリの主な機能は、設定された時間しきい値を超える SQL ステート...
以前は MySQL 5.7 を使用していましたが、MySQL にいくつか新しい機能が追加されたため、...
Docker コンテナに繰り返し入って操作することを避けるために、コンテナ内の一連の命令をホストマシ...