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 はドラッグ可能なモーダルボックスを実装します

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

推薦する

nginx + fastcgi を使用して画像認識サーバーを実装する

背景ディープラーニング モデルの推論には、特定のデバイスが使用されます。マシンは、モデルの読み込み、...

基本的な HTML ディレクトリの問題 (相対パスと絶対パスの違い)

相対パス - ファイルを参照する Web ページの場所に基づいて確立されたディレクトリ パス。そのた...

Dockerイメージ構築原理の分析(Dockerをインストールしなくてもイメージを構築できる)

イメージの構築は、DevOps プロセスにおいて非常に重要なプロセスです。一般的に、イメージの構築と...

HTML テーブル マークアップ チュートリアル (1): テーブルの作成

<br />これは 123WORDPRESS.COM が提供する一連のチュートリアルです...

シンプルな CSS テキストアニメーション効果

成果を達成する 実装コードhtml <div id=コンテナ> いらっしゃいませ <...

ES6 配列のコピーおよびフィルメソッド copyWithin() および fill() の具体的な使用法

目次バッチコピー copyWithin()配列を埋めるメソッド fill()指数の計算方法については...

MySQL チュートリアル データ定義言語 DDL の例 詳細な説明

目次1. SQL言語の基本機能の紹介2. データ定義言語の目的3. データベースの作成と破棄4. デ...

7つの基本的なXHTMLコーディングルールの概要

1. すべてのタグには対応する終了タグが必要です以前の HTML では、<p> や &l...

MySQL 5.7.18 のダウンロードとインストールの詳細な手順

MySql ダウンロード1. 公式サイトを開き、ダウンロード パスを見つけます。ダウンロード アドレ...

MySQL InnoDB のトランザクション特性を確保するにはどうすればよいですか?

序文「データベース トランザクションの特徴は何ですか?」と尋ねられたら、 ACID 特性である原子性...

js+ca​​nvas でコードレイン効果を実現

この記事では、js+ca​​nvasコードの雨効果の具体的なコードを参考までに共有します。具体的な内...

CSS を使用して複数の方法で下揃えを実装するサンプル コード

会社のビジネス要件により、次の図の赤い領域の効果を達成する必要があります。 効果の説明: 1. 赤い...

Nginxはhttpとhttpsの両方のアクセスをサポートするために同じドメイン名を設定します

Nginx は同じドメイン名で構成されており、http と https の両方でアクセスできます。証...

Windows に mysql5.7.28 winx64 の解凍バージョンをインストールするための詳細なチュートリアル

目次1. 解凍する2. データフォルダを作成する3. MySQLに環境変数を追加する3.1 コントロ...

css-loader を使用して vue-cli で css モジュールを実装する

【序文】 Vue と React の CSS モジュール ソリューションはどちらも、実装にローダーに...