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フレームワーク

推薦する

Javascriptのクロージャとアプリケーションの詳細な説明

目次序文1. クロージャとは何ですか? 1.1 クロージャは条件コードを満たす1.2 クロージャ生成...

JavaScript の onblur および onfocus イベントの詳細な説明

HTML ページでは、ボタンやテキスト ボックスなどの視覚要素にフォーカスを設定したり、フォーカスを...

Vmware での Ubuntu サーバーのインストール チュートリアル

この記事では、Ubuntuサーバーバージョンのインストールグラフィックチュートリアルを参考までに紹介...

Nginx で Brotli 圧縮アルゴリズムを有効にする方法の例

Brotli は、Zopfli よりも 20 ~ 26% 高い圧縮率を実現できる新しいデータ形式です...

mysql 5.7.18 winx64 パスワード変更

MySQL 5.7.18 が正常にインストールされた後、バージョン 5.7 では空のパスワードでのロ...

Centos6.5 の rpm パッケージから mysql5.7 をインストールするときに発生する初期化エラーの解決策

1. rzをサーバーにアップロードして解凍する rz [root@mini2 アップロード]# ta...

MySQL 5.7.20 Green Edition のインストールの詳細なグラフィックチュートリアル

まず、MySQL とは何かを理解しましょう。 MySQL は、スウェーデンの会社 MySQL AB ...

mysql はインデックスを無効にしますか?

mysql の IN はインデックスを無効にしますか?しませんよ! 結果をご覧ください: mysq...

nginx.conf のルートディレクトリ設定の詳細な説明

nginx.conf を構成するときには常に何らかの問題が発生します。ここでは、よくある問題とその解...

Reactフックの仕組み

目次1. React フックと純粋関数2. シンプルなmyUseState 3. myUseStat...

IE10以下のimgタグ問題の解決方法

問題を見つける以前、簡単なデモを書いたのですが、IE10以下では動作しないことがわかりました。ここに...

MYSQL パフォーマンス アナライザー EXPLAIN 使用例分析

この記事では、例を使用して MYSQL パフォーマンス アナライザー EXPLAIN の使用方法を説...

JavaScriptにおける評価戦略の詳細な説明

目次それを覆う栗パラメータの受け渡し値渡し共同配送要約する拡張機能 - 遅延評価私は最近、JavaS...

16進カラーコード(完全版)

赤とピンク、およびそれらの 16 進コード。 #990033 #CC6699 #FF6699 #FF...