Maison  >  Article  >  base de données  >  Explication détaillée de l'exemple de troncature automatique super longue MySql

Explication détaillée de l'exemple de troncature automatique super longue MySql

小云云
小云云original
2017-12-25 14:38:472396parcourir

Un ami a posé une question, pourquoi les mots trop longs ne peuvent-ils pas être automatiquement tronqués lors de l'appel d'instructions insert ou update dans le projet, mais peuvent être automatiquement tronqués lorsqu'ils sont exécutés directement dans navicat ? Cet article présente principalement les informations pertinentes sur l'explication détaillée des exemples de troncature automatique super longue de MySql. Voici un exemple pour illustrer comment implémenter la fonction de troncature automatique. Les amis qui en ont besoin peuvent s'y référer.

est le suivant


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%';

Évidemment, varchar(20) n'est pas suffisant pour accueillir 12121312312312 ah ah ah Ah, aassasdasd

les résultats de la requête sont les suivants

est effectivement automatiquement tronqué, mais lors de l'exécution du même SQL dans le projet, il se retrouve que ce n'est pas le cas et qu'une erreur est signalée à la place.


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

Considérant qu'il s'agit de la même base de données et qu'il n'y a pas de modes différents, la possibilité devrait apparaître sur jdbcDriver.

Voir le code source de 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
      }
 
    }
  }
}

Voir la méthode getJdbcCompliantTruncation, sa valeur par défaut est


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

Ainsi, à partir de la version 3.1.2, si jdbcCompliantTruncation n'est pas défini dans jdbcurl, il ne sera pas tronqué et signalera une erreur par défaut.

Alors est-il possible d'ajouter des paramètres ?

Faisons un compromis :

S'il est tronqué et semble trop long, il peut y avoir un risque de perte de précision.

Il est donc recommandé de le vérifier dans le programme.

Je travaille actuellement sur l'utilisation de la validation d'hibernation.

Recommandations associées :

Troncation de chaîne chinoise PHP sans solution tronquée

Champ de type de texte dans la base de données MSSQL en PHP Le champ tronqué solution en

Séquence de fragmentation et de troncature en python

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn