MySQL データベース内の varchar 型の数値のサイズを比較する方法

MySQL データベース内の varchar 型の数値のサイズを比較する方法

テストテーブルを作成する

-- ----------------------------
-- check_test のテーブル構造
-- ----------------------------
`check_test` が存在する場合はテーブルを削除します。
テーブル `check_test` を作成します (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `current_price` varchar(10) NOT NULL,
  `price` varchar(10) NOT NULL,
  主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 デフォルト CHARSET=utf8;
 
-- ----------------------------
-- check_test の記録
-- ----------------------------
`check_test` に値 ('1'、'12'、'14') を挿入します。
`check_test` に値 ('2'、'22'、'33') を挿入します。
`check_test` に値 ('3'、'15'、'8') を挿入します。
`check_test` に値 ('4', '9', '7') を挿入します。
`check_test` に値 ('5'、'12'、'12.9') を挿入します。 

次の SQL を実行します。

-- current_price が price より小さいレコードを検索します。select * from check_test where current_price<price;
check_test から (current_price+0)<(price+0) となる * を選択します。
 
-- current_price が price より大きいレコードを検索します。select * from check_test where current_price>price;
check_test から (current_price+0)>(price+0) となる * を選択します。

結果は次のとおりです。

結果 1では、 15>8 は条件を満たしていませんが見つかります。一方、結果 3 では、 15>8 は条件を満たしていますが見つからないことがわかります。

これはなぜでしょうか?文字列型の数値の比較は、最初の桁から始まり、文字コード内の対応する値を比較します。等しい場合は、2 番目の桁の比較を続けます。等しくない場合は、大きい方の値が比較されます。数字に対応するASCIIコード値は次のとおりです。

例えば:

  • current_price="12"、price="14"の場合、最初の文字「1」のASCII 10進値は49で、これらは同じです。2番目の文字「2」のASCII 10進値は50で、「4」のASCII 10進値は52です。50<52なので、結果は正しいです。
  • current_price="15"、price="8"の場合、current_priceの最初の文字「1」に対応するASCII 10進値は49、priceの最初の文字「8」に対応するASCII 10進値は56で、49<56なので、クエリは実行できますが、期待した結果にはなりません。

これは、JavaScript を使用してコードで確認できます。

var 現在の価格 = "12";
var 価格 = "14";
console.log(current_price < price); // true
 
var 現在の価格 = "15";
var 価格 = "8";
console.log(current_price < price); // true

そのため、比較する必要がある可能性のある数値は、varchar 型に設定しないでください。ただし、varchar 型に設定されている場合、比較する場合は、比較用に数値型に変換し、SQL でフィールドに 0 を追加します。

プログラミング言語の場合は、対応する関数を介して変換する必要があり、JavaScript のように 0 を追加して直接変換することはできません。

var 現在の価格 = "12";
var 価格 = "14";
console.log(parseInt(current_price) < parseInt(price)); // true
 
var 現在の価格 = "15";
var 価格 = "8";
console.log(parseInt(current_price) < parseInt(price)); // false

注: 文字に対応する 10 進数値はエンコードに関連していますが、ASCII コードとは互換性があります。

参考リンク:

文字列型の数値の比較

VARCHAR型文字列の比較

varchar型の数値のサイズの比較

これで、MySQL データベースの varchar 数値のサイズを比較する方法についての記事は終了です。MySQL varchar 数値のサイズの比較の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Mysql varchar のサイズと長さの問題の概要
  • MySQL VARCHARのサイズを決定する方法

<<:  画像をハイパーリンクとして使用したときに表示される青いボックスを削除する方法

>>:  VueのVuexの4つの補助機能について

推薦する

JavaScript の手ぶれ補正とスロットリングの詳細な説明

目次デバウンススロットル要約するデバウンス定義: スクロール イベントなど、短時間に連続してトリガー...

MySQL のバイナリおよび varbinary データ型の詳細な説明

序文BINARY と VARBINARY は、文字列ではなくバイナリ文字列を格納する点を除いて、CH...

Linux システム修復モード (シングル ユーザー モード)

目次序文1. シングルユーザーモードでの一般的なバグ修正2. シングルユーザーモードでシステムパスワ...

ウェブデザインの達人がよく使うレスポンシブフレームワークを共有する(要約)

この記事では、Web デザインの達人がよく使用するレスポンシブ フレームワーク (概要) を紹介し、...

VScode設定のリモートデバッグLinuxプログラムの問題を解決する

VScode リモートデバッグ Linux プログラムの問題について見てみましょう。具体的な内容は以...

Ubuntu 18.04 で中国語入力方法を設定する方法

Ubuntuの最新バージョンでは、ユーザーは中国語入力方法を別途ダウンロードする必要がなくなりました...

IE8ブラウザはWebページ標準に完全互換となる

<br />海外メディアの報道によると、マイクロソフトはソフトウェアの相互運用性への取り...

Matlab による JavaScript プログラミング、重心アルゴリズムによる位置決め学習

目次Matlab セントロイドアルゴリズムMatlab はクローズドな商用ソフトウェアであり、米国政...

Vue はトークンの有効期限が切れると自動的にログインページにジャンプする機能を実装します

このプロジェクトは最近テストされ、テスターから、トークンの有効期限が切れたため、ルートが自動的にログ...

yum インストールエラーの問題を解決する 保護されたマルチライブラリバージョン

現在、クラウドサーバーに nginx をインストールする際、最初に zlib などの依存ライブラリを...

Windows 10 Home EditionにDockerをインストールする方法を教えます

Redisの本やSpring Cloud Alibabaの本を執筆した際に、一部の分散コンポーネント...

CentOS 7 で yum を使用して MySQL 5.7.20 をインストールする最も簡単な方法

CentOS7 のデフォルトのデータベースは mariadb ですが、mysql を使っている人も多...

CSS 極座標のサンプルコード

序文このプロジェクトには、衛星測位用のグラフィックスを含むチャートの要件があり、北半球または南半球の...

CSSでイメージマッピングを実装する方法

1. はじめにイメージマップを使用すると、画像の領域をホットスポットとして指定できます。この領域にマ...