Heim  >  Artikel  >  Datenbank  >  Ausführliche Erläuterung des Beispiels für die superlange automatische Kürzung in MySql

Ausführliche Erläuterung des Beispiels für die superlange automatische Kürzung in MySql

小云云
小云云Original
2017-12-25 14:38:472336Durchsuche

Ein Freund hat eine Frage gestellt: Warum können zu lange Wörter beim Aufrufen von Insert- oder Update-Anweisungen im Projekt nicht automatisch abgeschnitten werden, können aber automatisch abgeschnitten werden, wenn sie direkt in Navicat ausgeführt werden? In diesem Artikel werden hauptsächlich relevante Informationen zu den Beispielen für die automatische Kürzung in MySql vorgestellt. Hier ist ein Beispiel zur Veranschaulichung der Implementierung der automatischen Kürzungsfunktion. Ich hoffe, es kann jedem helfen.

lautet wie folgt


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

Offensichtlich reicht Varchar(20) nicht aus, um 12121312312312 unterzubringen ah ah ah Ah, aassasdasd

Abfrageergebnisse sind wie folgt

wird zwar automatisch abgeschnitten, aber beim Ausführen desselben SQL im Projekt wird es gefunden dass dies nicht der Fall ist und stattdessen ein Fehler gemeldet wird.


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

Da es sich um dieselbe Datenbank handelt und es keine unterschiedlichen Modi gibt, sollte die Möglichkeit auf jdbcDriver erscheinen.

Zeigen Sie den JDBC-Quellcode an


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
      }
 
    }
  }
}

Zeigen Sie die getJdbcCompliantTruncation-Methode an, ihr Standardwert ist


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

Wenn also ab Version 3.1.2 jdbcCompliantTruncation nicht in jdbcurl festgelegt ist, wird standardmäßig nicht abgeschnitten und ein Fehler gemeldet.

Ist es also möglich, Parameter hinzuzufügen?

Lassen Sie uns einen Kompromiss eingehen:

Wenn es abgeschnitten ist und zu lang erscheint, besteht möglicherweise das Risiko eines Genauigkeitsverlusts.

Es wird daher empfohlen, dies im Programm zu überprüfen.

Derzeit wird an der Verwendung der Ruhezustandsvalidierung gearbeitet.

Verwandte Empfehlungen:

PHP-Chinesische Zeichenfolgenkürzung ohne verstümmelte Lösung

Texttypfeld in der MSSQL-Datenbank in PHP Das abgeschnittene Lösung in

Fragmentierungs- und Kürzungssequenz in Python

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung des Beispiels für die superlange automatische Kürzung in MySql. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn