各位用户为了找寻关于MySql超长自动截断实例详解的资料费劲了很多周折。这里教程网为您整理了关于MySql超长自动截断实例详解的相关资料,仅供查阅,以下为您介绍关于MySql超长自动截断实例详解的详细内容
MySql超长自动截断实例详解
小伙伴问到一个问题,为啥在项目中调用插入或者更新语句时超长的字无法自动截断,而在navicat中直接执行是可以自动截断的?
如下
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19CREATE
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
?
1
2
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啊啊啊啊啊aassasdasd
查询结果如下
确实自动截断了,但是在项目中执行同样的sql发现并非如此,反而报错。
? 1Data truncated
for
column
'%s'
at
row %ld
考虑到是同一个数据库,不存在模式不同,那么可能性应该出现在jdbcDriver上。
查看jdbc源码
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28private 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方法,其默认值为
? 1 2private BooleanConnectionProperty jdbcCompliantTruncation = new BooleanConnectionProperty(
"jdbcCompliantTruncation"
,
true
,
Messages.getString(
"ConnectionProperties.jdbcCompliantTruncation"
),
"3.1.2"
, MISC_CATEGORY,
Integer
.MIN_VALUE);
因此从3.1.2版本在jdbcurl中如果没有设置jdbcCompliantTruncation那么默认将会执行不截断并且报错。
那么加上参数是否可以呢?
取舍一下:
如果截断当出现比超长可能会有精度丢失的风险。
因此建议还是在程序中检查。
目前正在做关于使用hibernate validate的相关。
以上就是关于MySQL 截断的讲解,大家如有疑问可以留言或者到本站社区交流讨论,共同进步, 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:https://my.oschina.net/qixiaobo025/blog/912213