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 つの異なる状態) の設定例

推薦する

MySQLはトリガーを使用してデータベース内のテーブルの行制限を解決します。詳細な説明と例

MySQLはトリガーを使用してデータベース内のテーブルの行制限を解決します。詳細な説明と例最近のプロ...

Vueプロジェクトのパッケージ化の詳細な説明

目次1. 関連構成ケース1(使用ツールはvue-cil)ケース2(使用するツールはwebpack) ...

Nest.js パラメータ検証とカスタム戻りデータ形式の詳細な説明

0x0 パラメータ検証Nest.jsでは、パラメータ検証業務のほとんどをパイプライン方式で実装してい...

ストリーマーボタンの効果を実現するCSS3アニメーション

CSS3 を学習する過程で、CSS3 属性を使用すると多くのクールな効果を簡単に実現できることが分か...

Dockerでデータディレクトリを移行する方法

目次ディスク使用量の表示ディスク クリーンアップ (軽々しく使用しないでください)データの移行ディス...

HTML テキストエスケープのヒント

今日、CSDN で HTML テキスト エスケープのちょっとしたトリックを見ましたが、とても簡単です...

Linux で ARM 開発ボード用のファイルシステムを作成する

1. Busyboxのソースコードをオンラインでダウンロードしてください。コンパイル方法については、...

MySQL が重複データを挿入するのを防ぐ 3 つの方法

新しいテーブルを作成する テーブル「人」を作成します( `id` int NOT NULL COMM...

Vue Element-ui フォーム検証ルールの実装

目次1. はじめに2. ルール検証の入力モード2.1 サンプルコード2.2、フォーム項目2.3. 小...

MySQL 5.7.18 無料インストールバージョンの設定チュートリアル

MySQL 5.7.18 無料インストール版のインストールチュートリアルMySQL は現在、世界で最...

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

序文最近、私は小さな個人ブログ プロジェクトを書くのに忙しくしています。 「グローバル検索」機能を実...

MySQLの自動増分主キーIDはこのように処理されません

MySQLの自動増分主キーIDは段階的に増加しません1. はじめにMySQL データベースにデータを...

MySQL 5.7 の Docker バージョンを MySQL 8.0.13 にアップグレードし、データを移行する

目次1. 古いMySQL5.7データをバックアップする2. MySQL8.0.13のイメージをプルし...

Vueは右上隅の時間表示のリアルタイム更新を実装します

この記事の例では、右上隅の時間表示のリアルタイム更新を実現するためのVueの具体的なコードを紹介しま...

ECMAscript の新機能の紹介

目次1. 関数パラメータのデフォルト値1.1 関数パラメータのデフォルト値の指定1.2 分離割り当て...