> 데이터 베이스 > MySQL 튜토리얼 > MySql에서 너무 긴 자동 잘림 사례에 대한 자세한 설명

MySql에서 너무 긴 자동 잘림 사례에 대한 자세한 설명

黄舟
풀어 주다: 2017-07-24 15:45:17
원래의
1826명이 탐색했습니다.

이 글은 주로 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)은 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이 설정되어 있지 않으면 잘림 없이 실행되어 보고됩니다. 기본적으로 오류가 발생합니다.

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

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

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

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

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

위 내용은 MySql에서 너무 긴 자동 잘림 사례에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿