ホームページ  >  記事  >  データベース  >  MySqlで長すぎる自動切り詰めの場合の詳細な説明

MySqlで長すぎる自動切り詰めの場合の詳細な説明

黄舟
黄舟オリジナル
2017-07-24 15:45:171801ブラウズ

この記事では、MySql の超長自動切り捨てインスタンスの詳細な説明に関する関連情報を主に紹介します。自動切り捨て機能の実装方法を示す例を示します。必要な方は参考にしてください。 MySql の超長い自動切り捨てインスタンス

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

以下の通り

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 の使用に取り組んでいます。

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

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