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 ベースのシーケンス実装方法

チームは新しいフレームを交換しました。すべての新しいビジネスでは、新しいフレームワークと新しいデータ...

HTMLページのネイティブVIDEOタグはダウンロードボタン機能を隠します

Web プロジェクトを作成しているときに、紹介ビデオが別にある紹介ページに遭遇しました。この短いビデ...

Linux で Sudo を使用して権限を委譲する

sudo 権限委譲の概要su スイッチ ID: su –l ユーザー名 –c 'コマンド&#...

2013年のウェブデザインUIの最もホットなトレンド最も人気のあるUIデザイン

時は経つのが早く、わずか 6 日後には 2013 年が歴史になります。今年は、いわゆるトレンドが多す...

MySQL 5.1 のパスワードを変更し、MySQL データベースにリモートでログインする方法

mysql ユーザーを作成し、承認します。形式: 「ユーザー パスワード」で識別されるユーザー@ログ...

MySQL 8.0.18はデータベースにユーザーを追加し、権限を付与します

1. データベースにログインするには、rootユーザーを使用することをお勧めします。 mysql -...

Nginx http ヘルスチェック構成プロセス分析

パッシブチェックパッシブ ヘルス チェックでは、NGINX と NGINX Plus はイベントの発...

MySQLデータベースはsysbenchに基づくOLTPベンチマークテストを実装します

Sysbench は、MySQL データベース ストレージ エンジン InnoDB のディスク I/...

MySQLのint主キーの自己増分の問題を解決する

導入MySQL データベースを使用する場合、int を主キーとして使用し、自動インクリメントに設定す...

MySQL データベースを手動および自動でバックアップする 8 つの方法

MySQL は人気のオープンソースデータベース管理システムとして多くのユーザーが利用しています。デー...

MySQL Truncate の使用方法の詳細な説明

目次MySQL 切り捨ての使用1. 構文を切り捨てる2. Truncateの使用上の注意3. TRU...

Vue シングルページ アプリケーションで Markdown レンダリングを実装する

以前、Markdown をレンダリングするときに、mavonEditor のプレビュー モードを使用...

MySQL は、元のデータと同じデータがある場合、更新ステートメントを再度実行しますか?

背景この記事では主に、MySQL が更新ステートメントを実行するときに、元のデータと同一の (つまり...

MySQL メタデータで Hive テーブル作成ステートメントのコメント スクリプトを生成する方法

序文この記事は主にMySQLメタデータ生成Hiveテーブル作成ステートメントコメントスクリプトに関す...

Vue3コンポーネントの開発詳細

目次1. はじめに2. コンポーネント開発1. コンポーネントの構成2. ヘッダーコンポーネントの開...