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コードはすべて互換性が作られています。
参考リンク
今回の記事は、MySQLデータベースでvarcharの数値の大きさを比較する方法についてです。MySQL の varchar 数については、Script House の過去の記事を検索するか、引き続き以下の関連記事を参照してください。
関連
-
mysqlのデータ圧縮性能比較 詳細
-
MySql認証ベースのvsftpd仮想ユーザー
-
MySQL インタビューの質問 - ハッシュインデックスを設定する方法
-
Mysqlのソート機能の詳細
-
MySQLデータベースで数百万件のデータを10秒間で挿入
-
[解決済み] datetimeの挿入時に文字列から日付や時刻を変換すると、変換に失敗する
-
[解決済み】ValueError: 値の長さがインデックスの長さと一致しない|Pandas DataFrame.unique()
-
[解決済み】マルチパート識別子をバインドできない
-
sql エラーを解決する オペランドには1つの列が含まれている必要があります。
-
SQLステートメントエラーです。オペランドには 1 つのカラムを含める必要があります [括弧を追加せずに複数のフィールドをクエリする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQLのデータバックアップにmysqldumpを使用する方法
-
MySQL Innodb インデックスメカニズム詳細解説
-
MySQLデータベース・インデックスの左端一致の原則
-
MySqlの整数インデックスと文字列インデックスの失敗または暗黙の変換問題
-
MySQL演算子(and, or, in, not)の具体的な使用方法
-
MySQLデータ型の詳細
-
MySQL サービスとデータベース管理
-
MySQLで正規表現を使う 詳細
-
[解決済み】MySQL - オペランドは1つのカラムを含む必要があります。
-
Mysqlデータベースへのリンク時にpymysqlがConnection refusedエラーを報告する