MySQLクエリで大文字と小文字を区別しない問題を解決する方法

MySQLクエリで大文字と小文字を区別しない問題を解決する方法

質問

最近、SSH フレームワークを使用して実用的なプロジェクトを完了していたときに、長い間悩まされていた不可解なバグに遭遇しました。最終的にそれを解決し、次のように記録しました。

質問: システムをテストしているときに、学生が突然、データベースに保存されているアカウントは管理者であるはずであることに気づきましたが、学生は管理者アカウントで正常にログインしました...

…EXM? ? ?これでいいですか?さて、このバグの原因を突き止めたほうがいいでしょう。その後、さまざまなトラブルシューティング手順を実行しましたが、問題は見つかりませんでした。最後に、HQL の代わりにデータベースを直接クエリする SQL ステートメントを記述することを考えましたが、問題が見つかりました。

ユーザー名 = 'admin'、パスワード = 'admin' の場合、ユーザーから * を選択します。
ユーザー名 = 'Admin'、パスワード = 'admin' の場合、ユーザーから * を選択します。

上記の 2 つの SQL ステートメントを使用してテーブルを個別にクエリすると、結果は驚くほど同じになります。 ……! !検索エンジンにアクセスして、キーワード「MySQL クエリ ケース」を検索すると、問題が見つかります。 MySQL クエリでは大文字と小文字は区別されません。これは本当にショックでした。キーワードは一般的に大文字と小文字が区別されないことは知っていましたが、クエリされるパラメータでも大文字と小文字が区別されないとは思いませんでした。 !次の SQL ステートメントをもう一度試しても、結果は同じです。

ユーザー名 = 'ADMIN'、パスワード = 'admin' の場合、ユーザーから * を選択します。

解決

インターネットで関連記事を探しましたが、よく書かれていました。ここに記事の説明を貼り付けます。

Mysql のデフォルトの文字検索戦略は、utf8_general_ci (大文字と小文字を区別しない)、utf8_general_cs (大文字と小文字を区別する)、utf8_bin (大文字と小文字を区別するバイナリ比較) です。 (注意: MySQL 5.6.10 では、utf8_genral_cs はサポートされていません!!! ! ! )

テーブルを作成するときは、テーブルの collat​​e プロパティを utf8_general_cs または utf8_bin に直接設定します。テーブルがすでに作成されている場合は、フィールドの Collat​​ion プロパティを utf8_general_cs または utf8_bin に直接変更します。

-- テーブルを作成します:
テーブルtesttを作成します(
id INT 主キー、
名前 VARCHAR(32) NOT NULL
)ENGINE = INNODB COLLATE = utf8_bin;
-- テーブル構造の照合プロパティを変更します。ALTER TABLE TABLENAME MODIFY COLUMN COLUMNNAME VARCHAR(50) BINARY CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL;

SQL ステートメントを変更し、クエリするフィールドの前にbinaryキーワードを追加するだけです。

-- 各条件の前に binary キーワードを追加します。select * from user where binary username = 'admin' and binary password = 'admin';
-- パラメータを binary('') で囲みます。select * from user where username like binary('admin') and password like binary('admin');

注: 私のプロジェクトでは、Hibernate フレームワークが使用されており、hql ステートメントは SQL ではありません。from from User where binary username = ? and binary password = ?;はエラーになります。その後、 from User where username like binary(?) and password like binary(?);エラーなしで試してください。理由は現在のところ不明です。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • MySQL の大文字と小文字の区別に関する注意
  • MySQLの文字タイプは大文字と小文字を区別します
  • MySQL で大文字と小文字を区別しないように設定する方法
  • MySQLの大文字と小文字の区別によって発生する問題の分析
  • MySQL データベースの大文字と小文字の区別の問題
  • MySQLテーブル名の大文字と小文字を区別しない設定方法の詳細な説明
  • Linux システム MySQL のパスワードを忘れた場合、パスワードをリセットし、テーブル名と列名の大文字と小文字を無視します
  • MySQL クエリ時に文字列の大文字と小文字を区別する方法
  • MySql クエリの大文字と小文字を区別しないソリューション (2)
  • MySQL テーブル名の大文字と小文字の選択

<<:  Ubuntu 16.04にJenkinsをインストールするための詳細な手順

>>:  オンラインチャットを実現するVue+sshフレームワーク

推薦する

CSS 画面サイズ適応実装例

CSS 画面サイズの適応を実現するには、まず CSS3 @media メディア クエリを導入する必要...

HTML の値属性と名前属性の機能と使用法の紹介

1. ボタンで使用される値は、「OK」、「削除」など、ボタンに表示されるテキストを指します。 2. ...

Linux md5sumコマンドの使い方

01. コマンドの概要md5sum - MD5検証コードを計算して検証するmd5sum コマンドは、...

Vueスロットの詳細な説明

1. 機能: 親コンポーネントが子コンポーネントの指定された位置に HTML 構造を挿入できるように...

HTML でのアンカータグの使用例の共有

アンカータグの使用法:同じドキュメント内の特定の場所にリンクすることをアンカー リンクと呼びます。ア...

HTML シンプルショッピング数量アプレット

この記事では、参考までにシンプルなHTMLショッピング数量アプレットを紹介します。具体的な内容は次の...

Nginx 逆生成 Mogilefs 分散ストレージ例の詳細な説明

1. 分散ストレージシステムの概要情報技術の継続的な発展により、利便性がもたらされる一方で、データ量...

JavaScriptタイマーとボタン効果設定の詳細な説明

タイマー効果: <div> <font id='timeCount'...

MySQL 8.0 における MySQL のインストールと新しいパスワード認証方法の詳細な説明

1. はじめにOracle が MySQL 8.0GA をリリースしました。海外での GA はリリー...

Docker データボリュームの一般的な操作コードの例

開発者が Dockerfile を使用してイメージをビルドする場合は、イメージをビルドするときにデー...

Linux コマンドラインのワイルドカードとエスケープ文字の実装

ハードディスクのファイル属性のバッチ表示など、特定の種類のファイルに対してバッチ操作を実行する場合、...

Maven モードで Tomcat ソースコードを実行する方法

序文最近、Tomcat の起動プロセスを分析していました。Tomcat のソース コードはアイデア次...

スクロールバーのスタイルを設定するための CSS サンプルコード

スクロール バーのスタイルを設定するための CSS 実装コードは次のとおりです。 •::-webki...

Dockerはブリッジを追加し、IPアドレスの範囲を設定します

バイナリ docker 19.03 バージョンがインストール後に docker0 ブリッジを自動的に...

ウェブサイトのビジュアルデザイン(画像とテキスト)における情報伝達の役割と方法

現代の Web ビジュアル デザインは、初期の情報の積み重ねから、その後のグラフィックスと抽象化、そ...