1. はじめに 最近、開発者が誤ってデータを削除したり更新したりするケースがよくあります。今回もまた問題になりました。全体のプロセスを見てみましょう。 2. プロセス 開発では本番フェーズでデータを修復する必要があるため、120のSQL文を実行してデータを更新する必要がある。 そこで開発者は本番データベースに接続し、最初のSQLを実行した。 テーブル名を更新し、ソース名を「bj1062-北京市朝陽区長営北辰富地」に設定します。 ここで、source_name は "-北京市朝陽区長営北辰富地" です。 この SQL を詳しく調べたところ、確かに問題がないことがわかりました。 where 条件も正常です。基本的な考え方は、アドレスの前に文字列 bj1062 を追加することです。本当にエラーはないのでしょうか?はい、エラーはありません。開発が完了した後、結果は確かに期待通りでした。 次に、開発者は上記の SQL と同じ残りの SQL を実行して、アドレスを更新しました。実行が完了した後、開発者は混乱し、source_name が 0 になっていることに気づきました。開発者はすぐに私に電話をかけ、こう言いました。
この期間中にサーバーにすぐにログインして binlog を確認しました。update 開発者と連携して迅速に操作時間を特定し、フラッシュバック SQL を生成してデータを復旧し、現場の証拠を保存しました。 次に、開発によって実行された SQL をチェックしたところ、非常に奇妙な SQL がいくつか見つかりました。 これらの SQL ステートメント内の引用符は、where フィールド名の後に配置されます。簡略化された SQL ステートメントは次のようになります。 tbl_name を更新し、str_col="xxx" = "yyy" を設定します。 では、この SQL は MySQL でどのようにセマンティック変換を実行するのでしょうか? こんな感じでしょうか? tbl_name を更新し、(str_col="xxx" ) = "yyy" に設定します。 これは文法上の誤りであり、次の形式のみになります。 tbl_name を更新し、str_col=("xxx" = "yyy") を設定します。 そして 「xxx」=「yyy」を選択 の値は0なので、 tbl_name を更新し、str_col="xxx" = "yyy" を設定します。 同等 tbl_name を更新し、str_col=0 を設定します したがって、すべての source_name フィールドは 0 に更新されます。 この種のステートメントが選択された形式で何が起こるかを調べてみましょう。 mysql [localhost] {msandbox} (テスト) > tbl_name から id、str_col を選択します。ここで、str_col="xxx" = "yyy" です。 +----+---------+ | id | 文字列 | | 1 | ああ | +----+----------+ | 2 | aaa | +----+---------+ | 3 | ああ | | 4 | ああ | この SQL では mysql [localhost] {msandbox} (テスト) > 警告 警告の表示が有効になりました。 mysql [localhost] {msandbox} (テスト) > tbl_name から id、str_col を拡張して選択し、str_col="xxx" = "yyy"\G を実行する方法について説明します。 ************************** 1. 行 **************************** id: 1 select_type: SIMPLE テーブル: tbl_name タイプ: インデックス セットに 1 行、警告 1 件 (0.00 秒) 可能なキー: NULL キー: idx_str 参照: NULL key_len: 33 行: 4 追加: where の使用; index の使用 フィルター: 100.00 注 (コード 1003): /* select#1 */ select `test`.`tbl_name`.`id` AS `id`,`test`.`tbl_name`.`str_col` AS `str_col` from `test`.`tbl_name` where ((`test`.`tbl_name`.`str_col` = 'xxx') = 'yyy') ここで彼はwhere条件を次のように変換します。 ((`test`.`tbl_name`.`str_col` = 'xxx') = 'yyy') この条件は、まず str_col と 'xxx' が等しいかどうかを判断します。等しい場合、括弧内の値は 1 になります。等しくない場合は 0 になります。 等号の片側は int で、もう一方は文字列なので、比較のために両側が float に変換されます。 MySQL の暗黙的な変換によって発生するクエリ結果エラーのケース分析 'yyy' は浮動小数点型に変換され、0 に等しくなります。0 と比較すると、0 は常に 1 に等しくなります。 mysql [localhost] {msandbox} (テスト) > 'yyy'+0.0 を選択します。 +-----------+ | 'yyy'+0.0 | | 0 | +-----------+ mysql [localhost] {msandbox} (テスト) > 0=0 を選択します。 +-----------+ セットに 1 行、警告 1 件 (0.00 秒) +-----+ セット内の 1 行 (0.00 秒) | 0=0 | +-----+ +-----+ | 1 | これにより、結果は常に真になります。つまり、選択ステートメントは次のSQLと同等です。 tbl_name から id、str_col を選択します (1=1)。 すべてのレコードが照会されます。 3. まとめ SQL を書くときは、引用符が正しい位置にあるかどうかに注意する必要があります。引用符の位置が間違っていると、SQL は正常でも、実行結果がすべて間違ってしまうことがあります。実行する前に、テスト環境でテストを実行し、IDE の構文強調表示を使用して対応する問題を特定する必要があります。 要約する 上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。 以下もご興味があるかもしれません:
|
n 個のアイテムがあり、これらのアイテムをグリッド レイアウトの列に並べ替える必要があるとします。列...
目次ノードのバージョンが一致しない、ノードをアップグレードまたはダウングレードするnvm を使用して...
vueプロジェクトでは、アップロードした画像に透かしを追加して参照できるようにするアップグレード版...
前回の記事「Docker コンテナの UID と GID を理解する」では、Docker コンテナ内...
序文リアルタイムのデータベース バックアップの必要性は非常に一般的です。MySQL 自体はレプリケー...
1つ。 wget https://dev.mysql.com/get/mysql57-communi...
環境設定1: MySQLをインストールし、MySQLのbinディレクトリを環境変数に追加する環境設定...
1. 計算属性とは何ですか? 簡単に言えば、計算された結果が属性に保存されるもので、キャッシュとして...
会社の影響力が拡大し、製品が改良され続けるにつれて、関連するイメージデザインもそれに追いつき、徐々に...
この記事では、Linux のユーザーおよびグループのコマンドについて例を挙げて説明します。ご参考まで...
目次1. ソースコード1.1 モノレポ1.2 タイプスクリプト2. パフォーマンス2.1 ソースコー...
目次cgroupとはcgroupの構成cgroupが提供する機能cgroup 内の CPU を制限す...
この記事では、WeChatアプレットがSMS認証コードのカウントダウンを送信するための具体的なコード...
次のスクリプトは、MySQLデータベース全体のスケジュールされたバックアップに使用されます。 mys...
退屈だったので、ループに関する簡単な演習をいくつかまとめてみました。JS を学び始めたばかりの方に役...