>  기사  >  데이터 베이스  >  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)은 12121312312312 aaaaaaaaassasdasd

쿼리 결과는 다음과 같습니다

실제로는 자동으로 잘리지만, 프로젝트 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부터는 jdbcurl에 jdbcCompliantTruncation이 설정되어 있지 않으면 잘림 없이 실행되어 보고됩니다. 기본적으로 오류가 발생합니다.

그럼 매개변수를 추가해도 괜찮을까요?

절충점을 만들어 보겠습니다.

잘려서 너무 길어 보이는 경우 정확도가 떨어질 위험이 있습니다.

그래서 프로그램에서 확인하시는 걸 추천드려요.

현재 최대 절전 모드 유효성 검사를 사용하는 작업 중입니다.

관련 권장 사항:

깨진 문자가 없는 PHP 중국어 문자열 잘림에 대한 솔루션

PHP에서 잘리는 MSSQL 데이터베이스의 텍스트 유형 필드에 대한 솔루션

Python의 조각화 및 잘림 순서

위 내용은 MySql 초장거리 자동 잘림 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.