1. ホーム
  2. データベース
  3. マイサク

MySQLデータベースでvarchar型の数値の大きさを比較する方法

2022-01-18 16:46:35

テストテーブルの作成

-- ----------------------------
-- Table structure for check_test
-- ----------------------------
DROP TABLE IF EXISTS `check_test`;
CREATE TABLE `check_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `current_price` varchar(10) NOT NULL,
  `price` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of check_test
-- ----------------------------
INSERT INTO `check_test` VALUES ('1', '12', '14');
INSERT INTO `check_test` VALUES ('2', '22', '33');
INSERT INTO `check_test` VALUES ('3', '15', '8');
INSERT INTO `check_test` VALUES ('4', '9', '7');
INSERT INTO `check_test` VALUES ('5', '12', '12.9');

以下のSQLを実行します。

-- Find the rows where current_price is smaller than price
select * from check_test where current_price<price;
select * from check_test where (current_price+0)<(price+0);
 
-- find the rows where current_price is greater than price
select * from check_test where current_price> price;
select * from check_test where (current_price+0)>(price+0);

結果は次のようになります。

 で確認することができます。 結果 1 15>8では条件にマッチしないがクエリされ、一方 結果 3 15>8の8は条件を満たしていますが、クエリされません。

これはなぜでしょうか?それは 文字列型の数値は、1ビット目から対応する文字エンコーディングの数値の大きさを比較し、等しければ2ビット目を続けて比較し、等しくない場合は大きい方の数値を大きくする

 例

  • current_price="12", price="14" の場合、最初の文字 "1" に対応するASCII 10進値が49で、どちらも同じ、2文字目 "2" のASCII 10進値は50なので ASCII 4" は52で 50<52 で、結果は正しいです。
  • current_price="15", price="8" の場合、current_priceの1文字目 "1" に対応するASCII10進値は49で、1文字目 "8" に対応するASCII10進値は0.01です。priceの1文字目"8"に対応するASCII 10進値は56、49<56なので問い合わせは可能ですが、期待した結果にはなりません。

ここではJavaScriptで、コードで検証してみましょう。

var current_price = "12";
var price = "14";
console.log(current_price < price);// true
 
var current_price = "15";
var price = "8";
console.log(current_price < price);// true

ですから、大きさを比較する可能性のある数値はvarcharに設定してはいけません。もし、すでにvarcharに設定されている場合は、比較のために数値型に変換して、SQLでフィールドに0を追加すればよいのです。

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

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

注)文字に対応する10進値はエンコーディングに関係しますが、ASCIIコードはすべて互換性が作られています。

参考リンク

文字列型の数値の大きさを比較する

VARCHAR 型の文字列のサイズを比較する

varchar 型の数値の大きさを比較する

今回の記事は、MySQLデータベースでvarcharの数値の大きさを比較する方法についてです。MySQL の varchar 数については、Script House の過去の記事を検索するか、引き続き以下の関連記事を参照してください。