ホームページ  >  記事  >  データベース  >  MySqlの超長い自動切り捨て例の詳細説明

MySqlの超長い自動切り捨て例の詳細説明

小云云
小云云オリジナル
2017-12-25 14:38:472337ブラウズ

友人が質問しました。なぜ長すぎる単語は、プロジェクト内でステートメントの挿入または更新が呼び出されるときに自動的に切り詰められないのに、navicat で直接実行すると自動的に切り詰められるのですか?この記事では、MySql の超長い自動切り捨ての例の詳細な説明に関連する情報を主に紹介します。自動切り捨て機能の実装方法を示す例です。必要な方は参考にしていただければ幸いです。

以下の通り


CREATE TABLE `p_app_station` (
 `WX_APP_ID` varchar(20) NOT NULL,
 `APP_SECRET` varchar(33) DEFAULT NULL,
 `IS_BINDING` int(1) DEFAULT '0',
 `ACCOUNT_ID` int(13) DEFAULT NULL,
 `TOKEN` varchar(40) DEFAULT NULL,
 `BIND_URL` varchar(200) DEFAULT NULL,
 `WX_APP_NAME` varchar(50) DEFAULT NULL,
 `WX_APP_SID` varchar(50) DEFAULT NULL,
 `WX_NO` varchar(50) DEFAULT NULL,
 `CREATE_USER_ID` varchar(13) DEFAULT NULL,
 `UPDATE_DATE` datetime DEFAULT NULL,
 `CREATE_DATE` datetime DEFAULT NULL,
 `UPDATE_USER_ID` varchar(13) DEFAULT 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',
 PRIMARY KEY (`WX_APP_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


insert into p_app_station(wx_app_id) values('12121312312312啊啊啊啊啊aassasdasd');
select * from p_app_station where wx_app_id like '12121312312312%';

明らかに、varchar(20)は12121312312312ahhahah aassasdasdを収容するには十分ではありません

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

確かに自動的に切り詰められますが、同じことを行いますプロジェクト SQL はこれが当てはまらないことを検出しましたが、エラーを報告しました。


Data truncated for column '%s' at row %ld

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

jdbc ソース コードを表示します


private void setupServerForTruncationChecks() throws SQLException {
  if (getJdbcCompliantTruncation()) {
    if (versionMeetsMinimum(5, 0, 2)) {
      String currentSqlMode = this.serverVariables.get("sql_mode");
 
      boolean strictTransTablesIsSet = StringUtils.indexOfIgnoreCase(currentSqlMode, "STRICT_TRANS_TABLES") != -1;
 
      if (currentSqlMode == null || currentSqlMode.length() == 0 || !strictTransTablesIsSet) {
        StringBuilder commandBuf = new StringBuilder("SET sql_mode='");
 
        if (currentSqlMode != null && currentSqlMode.length() > 0) {
          commandBuf.append(currentSqlMode);
          commandBuf.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); // server's handling this for us now
      } else if (strictTransTablesIsSet) {
        // We didn't set it, but someone did, so we piggy back on it
        setJdbcCompliantTruncation(false); // server's handling this for us now
      }
 
    }
  }
}

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


private BooleanConnectionProperty jdbcCompliantTruncation = new BooleanConnectionProperty("jdbcCompliantTruncation", true,
    Messages.getString("ConnectionProperties.jdbcCompliantTruncation"), "3.1.2", MISC_CATEGORY, Integer.MIN_VALUE);

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

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

トレードオフを考えてみましょう:

切り詰められて長すぎるように見える場合は、精度が失われるリスクがある可能性があります。

なので番組内で確認することをお勧めします。

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

関連する推奨事項:

文字化けせずにPHPの中国語文字列が切り捨てられる問題の解決策

PHPでMSSQLデータベースのテキスト型フィールドが切り捨てられる問題の解決策

Pythonでの断片化と切り捨てシーケンス

以上がMySqlの超長い自動切り捨て例の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。