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

推薦する

Vue+webrtc (Tencent Cloud) ライブブロードキャスト機能の実装実践

目次1. 生放送効果2. ライブストリーミングを開始する手順2.1 Tencent Web(高速ライ...

Web フロントエンドのパフォーマンス最適化の詳細説明: リソースのマージと圧縮

2つの目的のためのリソースの結合と圧縮httpリクエストの数を減らす要求されたリソースのサイズを縮小...

Vue で Alibaba のアイコンフォント ベクター アイコンを使用する方法について

インターネット上には多くのインポート方法があり、公式も3つのインポート方法を提供していますが、インポ...

MySQLの保存場所を新しいディスクに移行する方法

1. 新しいディスクを準備し、現在のルートパーティションと同じファイルシステムでフォーマットし、ディ...

Dockerを使用してLaravel開発環境を構築するための完全な手順

序文この記事では、Docker を使用して、ローカル コンピューターにインストールされている開発スイ...

要素のフォーム要素の使用の概要

フォーム要素はたくさんあります。簡単にまとめると、次のようになります。私のやり方では、主にテキスト ...

HTML チュートリアル、optgroup 要素の理解

カテゴリ選択を選択します。テストの結果、IE と FF はこの要素を適切にサポートできることがわかり...

EChartsマルチチャート連携機能の実装プロセス

表示するデータが多い場合、1 つのチャートに表示しても効果はよくありません。このとき、2 つのチャー...

MYSQL SERVER のログファイルを縮小する方法

トランザクション ログには、関連するデータベースに対する操作が記録され、データベースの回復に関連する...

CSSは固定比率のブロックレベルコンテナを簡単に実装できる

H5 レイアウトを設計する場合、通常はバナーに遭遇することになります。例えば、2:1 で表示したい場...

よくある HTML タグの記述エラー

HTML Police がコードを調べて意味のないタグをすべて見つけ出すので、注意を払う必要がありま...

カスタム Docker イメージを作成するための Dockerfile の詳細な説明と CMD と ENTRYPOINT 命令の比較

1. 概要Docker イメージを作成するには、次の 3 つの方法があります。 Docker コミッ...

Vue+Element+Springboot画像アップロードの実装例

最近、たまたま vue+springboot のフロントエンドとバックエンドの分離プロジェクトに触れ...

Linux で JDK をインストールして環境変数を設定する方法 (この記事で十分です)

目次1. Linuxのビット数を確認する2. JDKをダウンロードする3. JDKをインストールする...