Cet article présente principalement les informations pertinentes sur l'exemple de troncature automatique super longue de MySql. Voici un exemple pour illustrer comment réaliser la fonction de troncature automatique. Les amis dans le besoin peuvent se référer à
Exemple de troncature automatique super longue de MySql. Explication détaillée
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 ?
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.
Afficher 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 } } } }
Afficher 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.
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!