MySQLがブール型を返すいくつかの状況について簡単に説明します。

MySQLがブール型を返すいくつかの状況について簡単に説明します。

mysqlはブール型を返します

ここに画像の説明を挿入

最初のケースでは、直接戻ります

select id='22aa' from mytest where age=202 は 1 を返し、これは true としてカプセル化できます。
select count(*)=1 from mytest where age=202 は1を返し、これはtrueとしてカプセル化できます。
select count(*)=0 from mytest where age=202 は0を返し、falseとしてカプセル化できます。
select count(*)<3 from mytest where age=202 は1を返し、これはtrueとしてカプセル化できます。
select count(*)<=1 from mytest where age=202 は1を返し、これはtrueとしてカプセル化できます。
select name="aa" from mytest where age=10 name が null の場合、sql はエラーを報告せず、返される結果も null になります。2 番目のケースの sql 3 コードを参照すると、エラーが報告されます。

要約:

この状況は、Java の判断文と似ています。ただ、Java では = は代入を意味するため、判断には == が使用されますが、MySQL では、代入には set が使用され、判断には = が直接使用されます。

2番目のケースでは、0または1を返すことでも目的を達成できます。

age=202 の mytest から enable を選択すると 1 が返され、これは true としてパッケージ化できます。
select count(*) from mytestは4を返しますが、これはブール型としてカプセル化できますが、falseです。
select enable from mytest where age=201 は null を返します。ブール型としてカプセル化できません。コードは直接エラーを報告します。 select id from mytest where age=202 は '22aa' を返します。ブール型としてカプセル化できますが、false になります。
select id from mytest where age=202 は 'true' を返します。ブール型としてカプセル化できますが、true です。
select id from mytest where age=202 は 'false' を返します。これはブール型 false としてカプセル化できます。
// 特殊なケース select * from mytest エラー selectOne() によって 1 つの結果 (または null) が返されると予想されましたが、見つかりました: 4
select * from mytest where age=202 は、データセット false 2019-08-28 202 15 1 を返します。これは false としてカプセル化できます。
select * from mytest where age=202 は、データセット true 2019-08-28 202 15 1 を返します。これは true としてカプセル化できます。
select * from mytest where age=202 は aaaa2019-08-28 202 15 1 というデータセットを返します。これは false としてカプセル化できます。

要約:

Mybatis は、クエリされたレコードの数に基づいて変換します (1=true、0=false)

注意点: 複数のレコード (1 より大きい) が見つかったが、false が返された場合、これは予想とはまったく逆の結果になります。ここでは、他の方法を使用してレコードの数を返すことで判断したり、レコードがデータベース内で一意であることを確認したりできます。最初のケースを直接使用して解決することもできます。

SQL ステートメント 4、5、および 6 のテストによれば、文字列が「true」の場合は true としてカプセル化でき、「false」の場合は false としてカプセル化でき、その他の状況の文字列はすべて false になります。

(これは単なる推測であり、正確ではありません。MySQL の公式 Web サイトで確認する必要があります。返されるフィールドが文字列の場合、それをブール値に変換するためにどのようなルールが使用されますか? Java の文字列からブール値へのメソッドに似ていると思います: Boolean.valueOf("aaa") //false、メソッドは次のとおりです)

ここに画像の説明を挿入

ここに画像の説明を挿入 SQL ステートメント 8、9、および 10 がグループを返すが、受け入れられるデータは 1 つだけという状況については、カプセル化に id 値が使用される理由についてさらに調査する必要があります。

MySQL ブール型の落とし穴

MySQL では、Boolean は tinyint(1) の別名に過ぎず、つまり MySQL には実際の bool 型は存在しません。しかし、SQLAlchemy は SQL を生成するときにこれを検出しなかったため、問題が発生しました。bool 型をクエリ条件として使用すると、インデックスが使用できず、テーブルスキャンが発生します。

> SELECT COUNT(*) FROM message WHERE message.is_national = 1 AND message.updated_at > '2020-01-01 00:00:00' AND message.deleted_at IS NULL;
+----------+
| カウント(*) |
+----------+
| 0 |
+----------+
セット内の1行
時間: 0.018秒
> SELECT COUNT(*) FROM message WHERE message.is_national is true AND message.updated_at > '2020-01-01 00:00:00' AND message.deleted_at IS NULL;
+----------+
| カウント(*) |
+----------+
| 0 |
+----------+
セット内の1行
時間: 2.162秒

1 行目と 2 行目の時間に注目してください。2 行目ではインデックスが使用されていないことは明らかです。答えを確認するために EXPLAIN の結果を見てみましょう。

> EXPLAIN SELECT COUNT(*) FROM message WHERE message.is_national = 1 AND message.updated_at > '2020-01-01 00:00:00' AND message.de
        leted_at が NULL です。
| id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 |
| 1 | SIMPLE | メッセージ | ref | ix_message_updated_at、idx_updated_at_is_national、ix_message_is_national | ix_message_is_national | 1 | const | 1 | where の使用 |

> EXPLAIN SELECT COUNT(*) FROM message WHERE message.is_national is true AND message.updated_at > '2020-01-01 00:00:00' AND messageag
        e.deleted_at は NULL です。
| id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 |
| 1 | SIMPLE | メッセージ | ALL | ix_message_updated_at、idx_updated_at_is_national | <null> | <null> | <null> | 非常に大きな数 | 何を使用するか
再 |

これに対して私はただ、それはぼったくりだと言いたいだけです。

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Mysqlはブール型の演算を設定します
  • MybatisはMySQLデータベースに接続します Tinyintはブール型です 詳細な説明
  • MySQLで偽または真を保存する方法

<<:  モバイルデバイスでのフリーズ問題に対する CSS3 ソリューション (アニメーション パフォーマンスの最適化)

>>:  ポータルサイト再設計のユーザーエクスペリエンス

推薦する

Nginx 502 Bad Gateway エラーの原因と解決策

Nginx 502 Bad Gateway エラーに何度か遭遇しました。ここでメモしておこうと思いま...

MySQL で結合を使用して SQL を最適化する方法の詳細な説明

0. 以下のテストに関連する表を準備する関連するテーブル作成ステートメントについては、https:/...

Linux でファイル内の特定の文字の数を数える方法

ファイル内の文字列の数を数えることは、実際には砂の中の石を探すようなものです。ある人は、石を見た後に...

Zabbix カスタム監視 nginx ステータス実装プロセス

目次Zabbix カスタム監視 nginx ステータス1. ステータスインターフェースを開く2. 監...

VMware 仮想マシンで Linux の IP アドレスを表示する方法

1. まず、コンピュータのデスクトップにある VMware アイコンをダブルクリックしてソフトウェア...

JavaScript スロットリングとアンチシェイクに関する簡単な説明

目次スロットルと手ぶれ防止コンセプト:違いスロットリングの実装スロットル機能手ぶれ補正の実装手ぶれ防...

HTMLの水平線注釈とコードコメントの使い方をマスターするだけです

水平線<hr /> タグを使用して、現在の位置に水平の分割線を描画します。例: XML/...

Mysql は最大接続数を表示し、最大接続数を変更します

MySQL 最大接続数の表示と最大接続数の変更1. 最大接続数を確認する '%max_con...

macOS SierraにApache2.4+PHP7.0+MySQL5.7.16をインストールする

Mac システムには PHP と Apache が付属していますが、必要なバージョンではない場合があ...

HTML+CSS+jQuery はスクリーンショットで検索ホットリストタブ効果を模倣します

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

Docker 自動ビルド 自動ビルド実装プロセス図

自動ビルドとは、Docker Hub を使用して、Dockerfile ファイルを含む GitHub...

MySQLがlocalhost経由でデータベースに接続できない問題に対する完璧な解決策

問題:あるサーバー上の PHP プログラムは、localhost アドレス経由でデータベースに接続で...

MySql 5.7.20 のインストールとデータおよび my.ini ファイルの構成

1. まずMySqlの公式サイトからダウンロードします参考: https://www.jb51.ne...

mysql5.7 以降で my.ini を設定するための詳細な手順

Windows 64 ビット版 MySQL 5.7 以降の解凍パッケージにデータディレクトリ、my-...