Mysql ファジークエリが大文字と小文字を区別するかどうかの詳細な調査

Mysql ファジークエリが大文字と小文字を区別するかどうかの詳細な調査

序文

最近、私は小さな個人ブログ プロジェクトを書くのに忙しくしています。 「グローバル検索」機能を実装しているときに、MySQL のあいまいクエリ ステートメントが少し魔法のようであることに気付きました (プログラミング段階に入ったばかりなので、笑わせるかもしれません、ハハハ)。MySQLのあいまいクエリ ステートメントは大文字と小文字を区別する場合もあれば、大文字と小文字を区別しない場合もあります。そこで、多くの実験を行い、次の結論に達しました (間違いがある可能性があります。私の欠点を指摘していただければ幸いです。また、一緒に問題について話し合う友人を歓迎します)。

まず COLLATE を紹介します。COLLATE は通常、データ エンコーディング (CHARSET) に関連しています。一般的に、各 CHARSET は複数の COLLATE をサポートしており、各 CHARSET はデフォルト値として COLLATE を指定します。たとえば、 latin1エンコーディングのデフォルトの COLLATE はlatin1_swedish_cigbkエンコーディングのデフォルトの COLLATE はgbk_chinese_ciutf8mb4エンコーディングのデフォルトの COLLATE はutf8mb4_general_ciです。

CHSRSET照合する
ラテン1ラテン1_スウェーデン語_ci
イギリス日本語
utf8mb4 utf8mb4_general_ci
utf8 utf8_bin

興味のある方は、Navicate などのデータベース視覚化ツールで自分で試すことができます。




注意: MySQL にはutf8utf8mb4 の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 t_blog where title like '%html%';

'%HTML%' のようなtitlet_blogから * を選択します。

結論は:

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 t_blog where title like '%html%';

選択

* titleが '%HTML%' のようなt_blogから

結論は

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%' のようなtitlet_blogから * を選択します。

'%html%' のようなtitlet_blogから * を選択します。

上記の実行結果から、このメソッドにより、あいまいクエリ ステートメントの大文字と小文字を区別できることがわかります。

大文字と小文字を区別しない

方法

必要なフィールドを個別に指定します (たとえば、ここで大文字と小文字を区別しない必要があるフィールドは、テーブル '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 t_blog where title like '%HTML%';

'%html%' のようなtitlet_blogから * を選択します。

上記の実行結果から、このメソッドにより、あいまいクエリ ステートメントの大文字と小文字を区別しないことができることがわかります。

解決策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%' のようなtitlet_blogから * を選択します。

'%html%' のようなtitlet_blogから * を選択します。

上記の実行結果から、フィールドを BINARY に変更すると、ファジー クエリ ステートメントで大文字と小文字が区別されることがわかります。

解決策4

大文字と小文字を区別

方法

図に示すように、現在の「t_blog」テーブルの「title」フィールドのCOLLATEは「utf8mb4_general_ci」であり、大文字と小文字は区別されません。

クエリ ステートメント フィールドの前に BINARY を追加します。

select * from `t_blog` where BINARY `title` like '%html%';

結論は

'%html%' のようなtitlet_blogから * を選択します。

select * from t_blog where BINARY title like '%html%';

上記の実行結果から、クエリ ステートメント フィールドの前に BINARY を追加すると、ファジー クエリ ステートメントで大文字と小文字が区別されることがわかります。

解決策5

(特に推奨されませんので、使用しないようにしてください)

対応する MySQL バージョンのmy.iniファイルを見つけます。この初心者の場合、バージョン 8.0.17 に相当します。


ファイルの最後の行に次の文を追加します。

小文字テーブル名=1

注: 0: 大文字と小文字を区別する、1: 大文字と小文字を区別しない

MySQLを再起動する

まだまだ説明が足りないところも多いので、専門家の方にアドバイスを頂きたいです!もっと詳しく知りたい場合は、ボスのブログを参照してください(崇拝)mysqlは大文字と小文字を区別します

要約する

MySQL ファジークエリが大文字と小文字を区別するかどうかについてのこの記事はこれで終わりです。MySQL ファジークエリの大文字と小文字の区別の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL におけるファジークエリの 4 つの使用法の紹介
  • MySql のファジークエリワイルドカードの使用に関する詳細な紹介
  • MySQL 単一テーブル複数キーワードあいまいクエリの実装
  • MySQL のあいまいクエリと正規表現の概要
  • MySQL ファジークエリを使用して中国語の文字を入力するときに Mybatis が結果を取得できない場合の対処方法
  • MySQL ファジークエリにおけるワイルドカードエスケープについての簡単な説明
  • PHP MYSQLはログインとファジークエリという2つの主要な機能を実装しています。
  • MySQL ファジークエリ LIKE と REGEXP の使用に関する詳細な紹介
  • MySQLのファジークエリのような遅い速度を解決する方法
  • MySQL での %% のようなファジークエリの実装

<<:  Linux の高性能ネットワーク IO と Reactor モデルの分析

>>:  HTML ハイパーリンク スタイル (4 つの異なる状態) の設定例

推薦する

シンプルなHTMLとCSSの使い方の詳細な説明

HTML と CSS を含む JD.com のホームページの静的ページ効果を 3 日間で完成させます...

Windows 10 で Hyper-V サービスをシャットダウンするいくつかの方法

VMware Workstation を使用して Windows 10 で仮想マシンを開くと、VMw...

Linuxネットワーク設定の基本操作コマンドを詳しく解説

目次ネットワーク構成を表示するネットワークインターフェース情報を表示する---ifconfigルーテ...

Vueはカウントダウン機能を実装する

この記事の例では、カウントダウン機能を実装するためのVueの具体的なコードを参考までに共有しています...

MySQL で単一のフィールド内の複数の値を分割および結合する方法

複数の値を組み合わせて表示これで、図1から図2に示す要件が揃いました。 どうやってやるんですか?次の...

MySQL スケジュールタスク例チュートリアル

序文MySQL 5.1.6 以降、非常にユニークな機能であるイベント スケジューラが追加されました。...

Dockerはコンテナを通じてイメージを生成し、詳細にDockerCommitを送信します

目次ローカルでコンテナを作成した後、このコンテナに基づいてローカル イメージを作成し、このイメージを...

リアルタイムコンピューティングフレームワークFlinkクラスタの構築と動作メカニズムについての簡単な説明

目次1. Flinkの概要1.1 基本的な紹介1.2 アプリケーションシナリオ2. 環境の展開2.1...

Vue でのルーティングガードの具体的な使用法

目次1. グローバルガード1.1 グローバルフロントガード1.2 グローバルポストルートガード1.3...

JavaScript シミュレーション計算機

この記事では、JavaScriptシミュレーション計算機の具体的なコードを参考までに紹介します。具体...

EXPLAIN コマンドの詳細な説明と MySQL での使用方法

1. シナリオの説明: 同僚から MySQL で explain を使用する方法を教わったので、返さ...

Linuxで大きなファイルを素早くコピーする方法

データをコピーリモートでデータをコピーする場合、通常は rsync コマンドを使用しますが、小さなフ...

MySQL カーソルの概念と使用法の詳細な説明

この記事では、例を使用して MySQL カーソルの概念と使用方法を説明します。ご参考までに、詳細は以...

MySQLのあいまいクエリインデックスの失敗の問題を解決するいくつかの方法

% ワイルドカードを使用すると、インデックス失敗の問題が発生することがよくあります。ここでは、lik...

Vue2は応答性を提供するためにprovide injectを実装しています

1. vue2 での従来の書き方 // 親コンポーネントは 'foo' を提供します...