MySQL 10進数符号なし更新負数を0に変換

MySQL 10進数符号なし更新負数を0に変換

今日、インターフェースの同時実行の問題を検証したところ、これまでredisで解決していた同時実行のプレッシャーがmysqlに移りました(redisはデータの設定と保​​存時に遅延があり、データの有効期限が切れるとデータベースからデータを取得する必要があり、ギャップが生じて大規模な同時実行と複数のデータ挿入のリスクが発生します。負荷分散のため、PHPのセマフォは使用できないため、mysqlのupdateを使用して同時実行を解決する必要があります。インデックスを設定した後、速度は遅くありませんが、プレッシャーがかかります)。フィールド (属性が符号なし 10 進数) を更新するときに、負の値を入力してもエラーは発生せず、自動的に 0 に変換されることがわかりました。長い間検索した結果、問題の原因は my.cnf の STRICT_TRANS_TABLES であることがわかりました。

この時点で、まずsql_modeを理解する必要があります

MySQL サーバーはさまざまな SQL モードで動作し、さまざまなクライアントにさまざまなモードを適用できます。これにより、各アプリケーションは独自のニーズに応じてサーバーの動作モードをカスタマイズできます。モードは、MySQL がサポートする SQL 構文と、実行するデータ検証チェックの種類を定義します。これにより、さまざまな環境で MySQL を使用したり、MySQL を他のデータベース サーバーと組み合わせて使用​​したりすることが容易になります。 --sql-mode="modes" オプションを指定して mysqld を起動すると、デフォルトの SQL モードを設定できます。上書きしたい場合は、この値を空にすることもできます (--sql-mode="")。 SET [SESSION|GLOBAL] sql_mode='modes' ステートメントを使用して sql_mode 変数を設定することにより、起動後に SQL モードを変更することもできます。 GLOBAL 変数を設定するには SUPER 権限が必要であり、その時点から接続するすべてのクライアントの操作に影響します。 SESSION 変数を設定すると、現在のクライアントにのみ影響します。どのクライアントも、いつでも自身のセッション sql_mode 値を変更できます。

sql_mode は、カンマ (',') で区切られたさまざまなモードのリストです。 SELECT @@sql_mode ステートメントを使用して現在のモードを照会できます。デフォルト値は空です(モードは設定されていません)。

主な重要なsql_mode値は次のとおりです。

ANSI

標準 SQL との一貫性を高めるために構文と動作を変更します。

STRICT_TRANS_TABLES

指定された値をトランザクション テーブルに挿入できない場合、ステートメントは中止されます。非トランザクション テーブルの場合、値が単一行ステートメントまたは複数行ステートメントの行 1 に表示されると、ステートメントは破棄されます。

伝統的

MySQL を「従来の」SQL データベース システムのように動作させます。このモードを簡単に説明すると、列に誤った値が挿入されたときに「警告ではなくエラーを出す」ということです。注意: エラーが見つかった場合は、INSERT/UPDATE を直ちに中止してください。非トランザクション ストレージ エンジンを使用している場合、エラー発生前に行われたデータ変更は「ロールオーバー」されず、「部分的に実行された」更新となるため、これは望ましいことではありません。

このマニュアルでは、「厳密モード」とは、少なくとも STRICT _TRANS_TABLES または STRICT _ALL_TABLES が有効になっているモードを意味します。

STRICT_TRANS_TABLES モードと STRICT_ALL_TABLES モードの違いは次のとおりです。

トランザクション テーブルの場合、STRICT_ALL_TABLES または STRICT_TRANS_TABLES モードが有効になっていると、ステートメントに不正な値または欠落した値があるとエラーが発生します。声明は放棄され、転がされる。

非トランザクション テーブルの場合、挿入または更新の最初の行に不正な値が発生した場合、両方のモードは同じように動作します。ステートメントは中止され、テーブルは変更されません。ステートメントが複数の行を挿入または変更し、不正な値が 2 行目以降に発生した場合、結果はどの厳密なオプションが有効になっているかによって異なります。

STRICT_ALL_TABLES の場合、MySQL はエラーを返し、残りの行を無視します。ただし、この場合、前の行はすでに挿入または更新されています。これは部分的な更新が可能であることを意味しますが、おそらくこれは望ましいことではありません。これを回避するには、テーブルを変更せずに破棄できる単一行ステートメントを使用するのが最適です。 STRICT_TRANS_TABLES の場合、MySQL は不正な値を列に最も近い有効な値に変換し、調整された値を挿入します。値が欠落している場合、MySQL は列に暗黙のデフォルト値を挿入します。どちらの場合でも、MySQL はエラーを生成してステートメントの実行を続行するのではなく、警告を生成します。

その他のモードは次のとおりです:

ALLOW_INVALID_DATES: 日付の有効性を完全にはチェックせず、月が 1 から 12 の間であるか、日が 1 から 31 の間であるかのみをチェックします。DATE と DATETIME にのみ有効で、TIMESTAMP には使用できません。TIMESTAMP では常に有効な入力が必要なためです。

ANSI_QUOTES: 有効にすると、" (二重引用符) が識別子として解釈されるため、文字列を二重引用符で囲むことはできません。

ERROR_FOR_DIVISION_BY_ZERO: 有効にすると、データがゼロで除算された場合 (または MOD(x,0))、挿入または更新中にエラーが発生します。有効にしない場合は、データがゼロで除算されたときに警告が発生し、システムは NULL を返します。

HIGH_NOT_PRECEDENCE: 有効にすると、以前の古いバージョンの優先度を取得できます。

NO_AUTO_CREATE_USER: GRANT が空のパスワードを持つユーザーを作成することを防ぎます。

NO_AUTO_VALUE_ON_ZERO: 自動インクリメント列に 0 または NULL を挿入すると、次の自動インクリメント値にはなりません。

NO_BACKSLASH_ESCAPES: バックスラッシュ「\」はエスケープ文字ではなく通常の文字として扱われます

NO_DIR_IN_CREATE: テーブルを作成するときに、すべてのインデックス ディレクトリとデータ ディレクトリのオプションを無視します。

NO_ENGINE_SUBSTITUTION: 有効にすると、必要なストレージ エンジンが無効になっているかコンパイルされていない場合にエラーがスローされます。有効にしない場合は、代わりにデフォルトのストレージ エンジンが使用され、例外がスローされます。

NO_UNSIGNED_SUBSTRACTION: 有効にすると、2 つの UNSIGNED 型を減算すると SIGNED 型が返されます。

NO_ZERO_DATE: 有効にすると、「0000-00-00 00:00:00」などのゼロ日付を挿入できなくなります。エラーが発生します。有効にしない場合は、挿入できますが、警告のみがスローされます。

NO_ZERO_IN_DATE: 有効にすると、月と日をゼロにすることはできません。「1999-01-00」のように NO_ZERO_DATE と一緒に有効にすると、警告ではなくエラーがスローされます。このオプションを単独で有効にすると、警告がスローされ、「0000-00-00 00:00:00」が挿入されます。

ONLY_FULL_GROUP_BY: GROUP BY 集計操作の場合、選択内の列がグループ化に表示されない場合は、この SQL ステートメントは無効です。

PAD_CHAR_TO_FULL_LENGTH: 有効にすると、CHAR 型は空のデータを切り捨てません。

PIPES_AS_CONCAT: 「||」を「or」演算子ではなく連結演算子として扱います。

REAL_AS_FLOAT: REAL を DOUBLE の同義語ではなく、FLOAT の同義語として扱います。

組み合わせオプション:

·ANSI:

REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、ANSI

·オラクル:

PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER、ORACLE

伝統的:

STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION、TRADITIONAL

MSSQL:

PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、MSSQL、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、MSSQL

DB2:

PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、DB2

MYSQL323:

優先度が高くない、MYSQL323

MYSQL40:

優先度が高くない、MYSQL40

MAXDB:

PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER、MAXDB

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL の 10 進数データ型の小数点埋め込み問題の詳細な説明
  • MySQL の 3 つの浮動小数点型 (float、double、decimal) の違いと概要について簡単に説明します。
  • MySQL データ型 DECIMAL の詳細な分析
  • MySQL における 10 進数型の使用法の簡単な紹介
  • MySQL データ型 DECIMAL(N,M) における N と M の意味の詳細な説明
  • MySQL データ型における DECIMAL の使用法の詳細な説明
  • MySQL における Decimal 型と Float Double 型の違い (詳細説明)
  • MySQL データ型 DECIMAL の使用方法の詳細な説明

<<:  JavaScript はドラッグ可能なモーダルボックスを実装します

>>:  フォームを送信した後、別のファイルに移動する

推薦する

W3C チュートリアル (5): W3C XML アクティビティ

XML は、データを記述、保存、送信、交換するために設計されています。 XML 1.0 は XML ...

CSS リスト モデルでのマーカー タグの使用

この記事では主に、 list-itemの下にある::master疑似要素、 list-style-i...

CSS3 アニメーション ボールローリング JS コントロールアニメーション一時停止

CSS3 はアニメーションを作成でき、多くの Web ページのアニメーション画像、Flash アニメ...

CSS は、小さな鋭角のチャット ダイアログ ボックスで鋭角の吹き出し効果を実現します。

1. CSS を使用して、小さな尖った角のチャット ダイアログ ボックスと尖った角の吹き出しを描画...

MySQL 外部キー設定方法の例

1. 外部キーの設定方法1. MySQL では、2 つのテーブルを関連付けるために、外部キー (FO...

複数のネットワークカードを備えた Linux システムでのルーティング構成の詳細な説明

Linux でのルーティング設定コマンド1. ホストルーティングを追加する ルートを追加 -host...

Docker Composeのデプロイと基本的な使い方の詳しい説明

1. Docker Composeの概要Compose は、マルチコンテナ Docker アプリケー...

URL 内の特殊記号の意味を知っていますか?

1.# # は Web ページ内の場所を表します。右側の文字はその位置の識別子です。たとえば、ht...

一般的な Linux の問題に対する解決策の概要

1. VMwareでCentos7を接続し、固定IPを設定する1) まず、仮想イメージ名を右クリック...

nginx でクロスドメイン障害修復を構成する方法の例

Nginxのクロスドメイン設定は次のようには機能しません サーバー{ 聞く 80; server_n...

Docker パッケージング ノード プロジェクトのプロセスの説明

バックエンド プログラマーとして、フロントエンドのものをいじらなければならないこともあります。そこで...

CSSのoutline-offsetプロパティを使用してプラス記号を実装する

次のような初期コードがあると仮定します。 <!DOCTYPE html> <htm...

MySQL Index Pushdown (ICP) とは何かを理解するための記事

目次1. はじめに2. 原則III. 実践3.1 インデックスプッシュダウンを使用しない3.2 イン...

Reactベースのコンポーネントのカプセル化の実装手順

目次序文antd はどのようにしてコンポーネントをカプセル化するのでしょうか?ディバイダーコンポーネ...

CentOS での mysql5.7 の詳細なインストールと設定のチュートリアル

インストールユーザーにインストール権限があることを確認してくださいルートスイッチなしsuルート(su...