MySQL json 形式のデータクエリ操作

MySQL json 形式のデータクエリ操作

デフォルトのテーブル名はbase_dataで、json列名はjson_valueです。

json_valueの値は

{“ids”:[“a”,“b”],“datas”:[{“name”:“张三”}]}

クエリは次のようになります

base_data から * を選択し、JSON_CONTAINS(json_value -> "$.ids", JSON_ARRAY('a')) を指定します。

または

base_data から * を選択し、JSON_CONTAINS(json_value -> "$.ids[*]", JSON_ARRAY('a')) を満たす必要があります。

どちらも良いですが、具体的な違いはまだ不明です

補足知識: MySQLのvarcharフィールドが長さ制限を超えると自動的に切り捨てられる問題 -----MySQLのsql_modeモードの説明と設定

MySQL sql_modeの適切な設定

sql_mode は見落とされやすい変数です。デフォルト値は null です。この設定では、不正なデータの挿入を許可するなど、不正な操作が許可される可能性があります。実稼働環境では、この値を厳密モードに設定する必要があり、開発およびテストフェーズで問題を検出できるように、開発およびテスト環境のデータベースも設定する必要があります。

SQLモデルは、次のような問題を解決するためによく使用されます。

(1)SQLモードを設定することで、さまざまな厳密さでデータ検証を完了し、データの準備状況を効果的に確保できます。

(2)SQLモデルをルーズモードに設定することで、ほとんどのSQL文が標準SQL構文に準拠していることを保証できます。これにより、異なるデータベース間でアプリケーションを移行するときに、ビジネスSQL文に大きな変更を加える必要がなくなります。

(3)異なるデータベース間でデータを移行する前に、SQLモードを設定すると、MySQL上のデータをターゲットデータベースに簡単に移行できるようになります。

sql_mode の一般的な値は次のとおりです。

ONLY_FULL_GROUP_BY:

GROUP BY 集計操作の場合、SELECT 内の列が GROUP BY に表示されない場合は、列が GROUP BY 句にないため、この SQL は無効です。

ゼロ以外の自動値:

この値は、自動インクリメント列への挿入に影響します。デフォルトでは、0 または NULL を挿入すると、次の自動インクリメント値が生成されます。このオプションは、ユーザーが値 0 を挿入し、列が自動増分されている場合に便利です。

STRICT_TRANS_TABLES:

このモードでは、トランザクション テーブルに値を挿入できない場合、現在の操作が中断され、非トランザクション テーブルには制限が課されません。

日付にゼロがない:

厳密モードでは、日と月の値がゼロになることはできません。

日付なし:

この値を設定すると、MySQL データベースはゼロ日付の挿入を許可しなくなり、ゼロ日付を挿入すると警告ではなくエラーがスローされます。

ゼロ除算エラー:

INSERT または UPDATE 中にデータがゼロで除算されると、警告ではなくエラーが生成されます。このモードが指定されていない場合、値がゼロで除算されると、MySQL は NULL を返します。

自動作成ユーザーなし:

GRANT が空のパスワードを持つユーザーを作成しないようにする

エンジン代替なし:

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

パイプAS_CONCAT:

「||」を OR 演算子ではなく文字列連結演算子として扱います。これは Oracle データベースと同じであり、文字列連結関数 Concat に似ています。

ANSI_QUOTES:

ANSI_QUOTES が有効になっている場合、二重引用符は識別子として解釈されるため、文字列を引用符で囲むことはできません。

ORACLE の sql_mode 設定は次のものと同等です。

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

MySQL を使用する場合、Oracle を使用するという全員の習慣を引き続き維持するために、MySQL の sql_mode を次のように設定できます。

my.cnfに次の設定を追加します

[mysqld]

sql_mode = 'ONLY_FULL_GROUP_BY、NO_AUTO_VALUE_ON_ZERO、STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、

ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、PIPES_AS_CONCAT、ANSI_QUOTES'

知らせ:

MySQL 5.6 と MySQL 5.7 のデフォルトの sql_mode パラメータは異なります。5.6 のモードは NO_ENGINE_SUBSTITUTION で、これは実際には null 値を表し、モード設定がないことに相当し、緩いモードとして理解できます。 5.7 のモードは STRICT_TRANS_TABLES で、厳密モードです。

: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :データの検証に加えて、学習するにつれて、MySQL がプログラムで行う多くのことをカバーする、さらに多くのことを実行できることが分かります。

厳密モードに切り替えた後に発生する可能性のある問題:

設定モードに NO_ZERO_DATE が含まれている場合、MySQL データベースはゼロ日付の挿入を許可せず、ゼロ日付を挿入すると警告ではなくエラーがスローされます。たとえば、テーブル内の TIMESTAMP 列 (NULL として宣言されていない場合、または DEFAULT 句が指定されていない場合) には、自動的に DEFAULT '0000-00-00 00:00:00' (ゼロ タイムスタンプ) が割り当てられます。また、このテストのテーブル内の日付列には、デフォルトでゼロ日付 '0000-00-00' COMMENT 'date' を挿入できます。これらは明らかに sql_mode の NO_ZERO_DATE を満たさず、エラーを報告します。

モードの設定と変更(上記の問題を解決する例):

方法1:

まず、select @@sql_modeを実行し、クエリされた値をコピーしてNO_ZERO_IN_DATEとNO_ZERO_DATEを削除し、set sql_mode = 'modified value'またはset session sql_mode = 'modified value';を実行します。たとえば、set session sql_mode = 'STRICT_TRANS_TABLES';を実行して、厳密モードに変更します。

このメソッドは現在のセッションでのみ有効であり、現在のセッションが閉じられている場合は有効になりません。

方法2:

まず select @@global.sql_mode を実行し、クエリされた値をコピーして NO_ZERO_IN_DATE と NO_ZERO_DATE を削除し、次に set global sql_mode = 'modified value' を実行します。

この方法は現在のサービスでは有効であり、MySQL サービスを再起動すると無効になります。

方法3: MySQLインストールディレクトリ、またはmy.cnfファイル(Windowsの場合はmy.iniファイル)に以下を追加します。

sql_mode = ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION、

次のようにmy.cnfを追加します。

[mysqld]

sql_mode=ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER

次に、mysql を再起動します。

この方法は永続的に有効です。もちろん、本番環境では MySQL サービスの再起動は禁止されているため、方法 2 と方法 3 を組み合わせてオンラインの問題を解決します。そうすれば、ある日本当に MySQL サービスが再起動されたとしても、永続的に有効になります。

上記のMySQL json形式のデータクエリ操作は、エディターがあなたと共有するすべてのコンテンツです。参考になれば幸いです。また、123WORDPRESS.COMを応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQLとPHPの基礎と応用: データクエリ
  • MySQLデータクエリが多すぎるとOOMが発生するかどうかについての簡単な議論
  • MySQLデータベースの数千万件のデータクエリとストレージの詳細な説明
  • MySQL 集計統計データの低速クエリの最適化
  • MySQL ビッグデータ クエリ最適化エクスペリエンスの共有 (推奨)
  • MySQL と PHP の基礎と応用: データクエリステートメント

<<:  docker runコンテナの自動終了の解決策

>>:  HTML における src と href の違いについての簡単な説明

推薦する

webpackでCSSを分割・圧縮し、リンクでインポートする手順

まずコードファイルの構造を見てみましょう。エントリファイル (index1.js) の内容: ...

MySQL ストレージ エンジンの基礎

前回の記事では、MySQL トランザクションについて説明しました。これで、MySQL トランザクショ...

JavaScript BOMの構成と一般的なイベントの詳細な説明

目次1. 部品2. BOMの構成2. ウィンドウオブジェクトの共通イベント1. ウィンドウ読み込みイ...

Centos 7 sshd の変更 | ルートログインの禁止と sshd ポートスクリプトの定義

1. 新しいユーザーwwweee000を作成します [root@localhost ~]# user...

Oracle の開閉の 4 つのモード

>1 データベースを起動するcmd コマンド ウィンドウで、「sqlplus」を直接入力して ...

ハイパーリンクのWebデザイン原則

<br />関連記事: Web コンテンツ ページ作成のための 9 つの実用的なヒント、...

ZabbixはPSK共有キーを使用してサーバーとエージェント間の通信を暗号化します。

Zabbix バージョン 3.0 以降、Zabbix サーバー、Zabbix プロキシ、Zabbi...

RocketMQ の Docker インストールとインストール中に発生した問題の解決策

目次rocketmqイメージを取得する名前rvを作成する単一のブローカーノードを作成するrocket...

nginxプロセスロックの実装の詳細な説明

目次1. nginxプロセスロックの役割2. エントリーレベルのロックの使用3. nginxプロセス...

CSSはボックスコンテナ(div)の高さを常に100%に設定します。

序文ブラウザをどのようにズームしても、ボックス コンテナーの高さを常に 100% に保つ必要がある場...

優れたグラフィックデザイナーが習得すべき7つのスキル

1》ウェブデザインが得意であること2》Webページのデザイン方法を知る3》計画する4. SEOを理解...

iframeを使用してページを呼び出すとページがキャッシュされるかどうかの簡単な分析

最近、毎日変更されるページを iframe を使用して呼び出す必要があるプロジェクトがあります。その...

Linux Tensorflow2.0のインストール問題を解決する

conda アップデート conda pip で tf-nightly-gpu-2.0-previ...

MySQL マスタースレーブ構築(複数のマスターと 1 つのスレーブ)の実装アイデアと手順

背景:最近、同社のプロジェクトは同時実行のプレッシャーに耐えられないようなので、最適化が差し迫ってい...

Kubernetes (k8s) 入門

Kubernetes は面白そうだったので(ギリシャ人なら名前に問題があると思うでしょうが)、ずっと...