MySql 自動切り捨て例の詳細な説明

MySql 自動切り捨て例の詳細な説明

MySql 自動切り捨て例の詳細な説明

友人が質問しました。プロジェクト内で挿入または更新ステートメントを呼び出すときに長すぎる単語を自動的に切り捨てることができないのに、Navicat で直接実行すると自動的に切り捨てられるのはなぜですか?

次のように

テーブル `p_app_station` を作成します (
 `WX_APP_ID` varchar(20) NULLではない、
 `APP_SECRET` varchar(33) デフォルト NULL,
 `IS_BINDING` int(1) デフォルト '0',
 `ACCOUNT_ID` int(13) デフォルト NULL,
 `TOKEN` varchar(40) デフォルト NULL,
 `BIND_URL` varchar(200) デフォルト NULL,
 `WX_APP_NAME` varchar(50) デフォルト NULL,
 `WX_APP_SID` varchar(50) デフォルト NULL,
 `WX_NO` varchar(50) デフォルト NULL,
 `CREATE_USER_ID` varchar(13) デフォルト NULL,
 `UPDATE_DATE` 日時 デフォルト NULL、
 `CREATE_DATE` 日時 DEFAULT NULL、
 `UPDATE_USER_ID` varchar(13) デフォルト NULL,
 `STATION_TYPE` int(1) unsigned zerofill DEFAULT NULL COMMENT 'マークタイプ(トライアル版:0、メンバー版:1、カスタム版:2)',
 `ACTIVE_DATE` datetime DEFAULT NULL COMMENT '有効期限',
 `APP_MODULE_ID` varchar(60) DEFAULT NULL COMMENT 'プッシュテンプレートメッセージID',
 主キー (`WX_APP_ID`)
) エンジン=InnoDB デフォルト文字セット=utf8
p_app_station(wx_app_id) に値('12121312312312啊啊啊啊啊aassasdasd') を挿入します。
p_app_station から、wx_app_id が '12121312312312%' のような * を選択します。

明らかにvarchar(20)は12121312312312を保持するには大きさが足りません。ああああああ、ああああ。

クエリの結果は次のとおりです

確かに自動的に切り捨てられましたが、プロジェクト内で同じ SQL を実行すると、そうではないことが判明し、代わりにエラーが報告されました。

行 %ld の列 '%s' のデータが切り捨てられました

同じデータベースであり、スキーマに違いがないことを考慮すると、可能性は jdbcDriver にあるはずです。

JDBC ソースコードを表示

プライベートvoid setupServerForTruncationChecks()はSQLExceptionをスローします{
  (getJdbcCompliantTruncation())の場合{
    バージョンが最小値(5, 0, 2)を満たす場合
      文字列 currentSqlMode = this.serverVariables.get("sql_mode");
 
      ブール値 strictTransTablesIsSet = StringUtils.indexOfIgnoreCase(currentSqlMode, "STRICT_TRANS_TABLES") != -1;
 
      (currentSqlMode == null || currentSqlMode.length() == 0 || !strictTransTablesIsSet) の場合 {
        StringBuilder commandBuf = new StringBuilder("SET sql_mode='");
 
        (currentSqlMode != null && currentSqlMode.length() > 0) の場合 {
          commandBuf.append(現在のSqlMode);
          コマンドBuf.append(",");
        }
 
        commandBuf.append("STRICT_TRANS_TABLES'");
 
        execSQL(null、commandBuf.toString()、-1、null、DEFAULT_RESULT_SET_TYPE、DEFAULT_RESULT_SET_CONCURRENCY、false、this.database、null、false);
 
        setJdbcCompliantTruncation(false); // サーバーがこれを処理します
      } そうでない場合 (strictTransTablesIsSet) {
        // 私たちは設定していませんが、誰かが設定したので、それに便乗します
        setJdbcCompliantTruncation(false); // サーバーがこれを処理します
      }
 
    }
  }
}

getJdbcCompliantTruncationメソッドを表示します。デフォルト値は

プライベート BooleanConnectionProperty jdbcCompliantTruncation = 新しい BooleanConnectionProperty("jdbcCompliantTruncation", true,
    Messages.getString("ConnectionProperties.jdbcCompliantTruncation"), "3.1.2", MISC_CATEGORY, Integer.MIN_VALUE);

したがって、バージョン 3.1.2 以降では、jdbcurl で jdbcCompliantTruncation が設定されていない場合、デフォルトでは切り捨てなしで実行され、エラーが報告されます。

それで、パラメータを追加することは可能ですか?

選択してください:

値が指定された長さより長い場合、精度が失われるリスクがあります。

そのため、プログラム内で確認することをお勧めします。

現在、hibernate validate の使用に取り組んでいます。

上記は、MySQL 切り捨てについての説明です。ご質問がある場合は、メッセージを残すか、このサイトのコミュニティに参加して議論し、一緒に進歩することができます。お読みいただきありがとうございます。皆様のお役に立てれば幸いです。このサイトをサポートしていただき、ありがとうございます。

以下もご興味があるかもしれません:
  • mysql5.7.19 winx64 解凍版のインストールと設定のチュートリアル
  • CentOS 6.4 MySQL 5.7.18 のインストールと設定方法のグラフィックチュートリアル
  • MySQL 5.7.18 のダウンロードとインストールの詳細な手順
  • MySql で正規表現クエリを使用する方法
  • PHP で MySQL テーブルが存在するかどうかを検出する方法の概要

<<:  sed コマンドを使用して文字列を置換する Linux チュートリアル

>>:  Linux Bash スクリプトを使用してユーザーを識別する方法の例

推薦する

SqlクエリMySqlデータベーステーブル名と説明テーブルフィールド(列)情報

以下では、SQL クエリ ステートメントを使用して、Mysql データベース内のテーブルのテーブル名...

Vue 関数のアンチシェイクとスロットリングの正しい使用方法

序文1. デバウンス: 高頻度イベントがトリガーされた後、関数は n 秒以内に 1 回だけ実行されま...

MySQL 8.0.18 安定版がリリースされました! 予想通りハッシュ結合が実装されました

MySQL 8.0.18 安定版 (GA) が昨日正式にリリースされ、Hash Join も期待通り...

Dockerイメージ解析ツールのダイブ原理解析

今日は、Docker イメージ、各レイヤーの内容を調べ、Docker/OCI イメージのサイズを縮小...

主要ブラウザとそのカーネルの紹介

トライデント コア: IE、MaxThon、TT、The World、360、Sogou Brows...

ウェブページで Enter キーを押すと自動的にフォームを送信し、他のページにジャンプするソリューション

ウェブページでEnterキーを押すと、フォームは自動的に送信され、他のページに移動します。クエリフォ...

Ubuntu20のtzselect設定時間失敗問題、Raspberry Piサーバ(推奨)

2 日前、Raspberry Pi サーバーを Ubuntu 20 にアップグレードしました。今日...

Typescript での infer キーワードの使用に関する詳細な理解

目次推測する事例:理解を深める参照する後で忘れないように、キーワード infer をメモしておきます...

vue2.x の徹底研究 - h 関数の説明

目次解決、要約: vue プロジェクト。 .vue ファイルのテンプレート内に記述されたコードは、w...

使用状況分析を備えたMySQL

持つことの使用法having 句を使用すると、グループ化後にさまざまなデータをフィルター処理できます...

WindowsにMySQL5.7圧縮パッケージを素早くインストールする

この記事では、Windows に MySQL 5.7 圧縮パッケージをインストールする方法について説...

js が CSS 属性 (値) のサポートを決定して通知する状況の分析

新しい CSS 機能を使用する場合、その互換性は常に考慮されます。おそらく、その互換性、どのブラウザ...

MySQL でテーブル メタデータ ロックを待機する理由と方法

MySQL が alter table などの DDL 操作を実行すると、テーブル メタデータ ロッ...

Mysql+JavaSwing に基づくスーパーマーケット商品管理システムの設計と実装

目次1. 機能紹介2. キーコード2.1 ホームページの機能2.2 製品情報を追加する2.3 データ...

Linux の高性能ネットワーク IO と Reactor モデルの分析

目次1. 基本概念の紹介2. ネットワークIOの読み取りと書き込みのプロセス3. 5つのLinuxネ...