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

推薦する

Docker を使用して pypi プライベート リポジトリを構築する方法

1. 建設1. htpasswd.txtファイルを準備するファイルには、パッケージを倉庫にアップロー...

MySQL 単一テーブルクエリの例の詳細な説明

1. データを準備するこのテーブルでは次の操作が実行されます 学生テーブルを作成 ( id int ...

分散監視システムZabbixはSNMPとJMXチャネルを使用してデータを収集します

前回の記事では、Zabbix のパッシブ、アクティブ、Web 監視に関するトピックについて学習しまし...

MySQL の 3 つの Binlog 形式の概要と分析

1つ。 Mysql Binlog フォーマットの紹介 Mysql binlog ログには、State...

TypeScript のマップされた型とより優れたリテラル型推論について説明します。

目次概要マップされた型を使用して Object.freeze() を構築するマッピングタイプの構文は...

NavicatがLinuxサーバー上のMySQLに接続できない問題を解決する

最初は悲しい気持ちになりました。スクリーンショットは以下の通りです。 少し苦労しましたが、解決策は次...

MySQL 8.0 ディクショナリテーブル拡張の詳細な説明

MySQL のデータ ディクショナリは、データベースの重要なコンポーネントの 1 つです。INFOR...

Linux システムで時間を取得して使用する方法

Linux システム時間には 2 種類あります。 (1)暦上の時刻。値は、指定された時刻、1970 ...

自作の Windows サーバーに egg アプリケーションを展開する方法 (画像とテキスト付き)

1. IEブラウザを使用してVPNにログインする 2. リモートログイン 3. サーバーに最新のn...

Vue プロジェクトは左スワイプ削除機能を実装します (完全なコード)

成果を達成するコードは次のとおりですhtml <テンプレート> <div> ...

Apache Tika を使用してファイルが破損しているかどうかを検出する方法

Apache Tika は、さまざまな形式のファイルからファイル タイプを検出し、コンテンツを抽出す...

DockerはRedisをインストールし、操作用のビジュアルクライアントを導入します

1 はじめにRedis 、 ANSI C言語で開発されたKey-Valueベースの高性能NoSQLデ...

MySQL スローログ実践のまとめ

遅いログクエリ機能スロー ログ クエリの主な機能は、設定された時間しきい値を超える SQL ステート...

Windows での MySQL 8.X インストール チュートリアル

以前は MySQL 5.7 を使用していましたが、MySQL にいくつか新しい機能が追加されたため、...

ホスト上のDockerコンテナ内でシェルまたはプログラムを実行する

Docker コンテナに繰り返し入って操作することを避けるために、コンテナ内の一連の命令をホストマシ...