我的windows机器上的MySql 5.7 Spring boot 1.4.0版本mysql jdbc驱动程序是5.1.39
我有一个表,有几个VARCHAR列,它们都设置为VARCHAR(100)。表的编码设置为:ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;。
我已经验证了,如果我使用MYSql工作台,我可以插入100个非英文字符(例如中文)。
现在,对于我的java代码,我要插入的字段是一个西班牙语字符串,getBytes().length返回115,所以它是115字节。
因为DB中的字段是100个字符,所以我假设插入115个字节的字符串应该不是问题。但这是我的问题,我得到了这个:
Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'addr1' at row 1
我曾尝试将useUnicode=true&connectionCollation=utf8_general_ci&characterSetResults=utf-8&characterEncoding=utf-8添加到网址,尝试将connectionProperty useUnicode=true;characterEncoding=utf-8;添加到我的application.yaml等,但没有成功
然后,我将@EnableAutoConfiguration更改为@Configuration,并添加以下内容:
@Bean
public DataSource datasource() {
org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
ds.setDriverClassName(databaseDriverClassName);
ds.setUrl(datasourceUrl);
ds.setUsername(databaseUsername);
ds.setPassword(databasePassword);
ds.setConnectionProperties("useUnicode=true;characterEncoding=utf-8;");
ds.setInitSQL("SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';");
return ds;
}
@Bean
public EntityManagerFactory entityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(false);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.xxx.xxx.entity");
Properties properties = new Properties();
properties.setProperty("hibernate.connection.useUnicode", "true");
properties.setProperty("hibernate.connection.charSet", "utf8mb4");
properties.setProperty("hibernate.connection.characterEncoding", "utf8mb4");
properties.setProperty("hibernate.id.new_generator_mappings", "false");
factory.setJpaProperties(properties);
factory.setDataSource(datasource());
factory.afterPropertiesSet();
return factory.getObject();
}还是有同样的东西!
我现在花了两天的时间……:-(我想一定是我犯了一个简单的错误,但是错误是什么呢?
谢谢
编辑:尝试通过调用存储库接口来保存记录,并且成功了!所以问题出在调用entitymanager.merge()。需要为实体管理器设置什么属性来处理UTF8吗?
编辑:我添加了更多的调试代码,现在问题似乎与JPA或hibernate无关……
我得到的字符串来自于对magento SOAP API的SOAP调用。下面是我的代码:
String s = "其次受影响较大的是金融体系,过去那么多年金融体系受益于低利率、信贷宽松、影子银行大扩张等,金融企业疯狂的扩张资产负债表,一个个都赚的钵满盆满(看看过去数年金融企业的疯狂高利润和增速,从业人员增速和工";
salesOrderModel.setAddr1(s);
try {
System.out.println(s + ", " + "[" + s.length() + "][" + s.getBytes("UTF-8").length + "]");
} catch (Exception e) {
e.printStackTrace();
}使用上面的代码,entitymanager.merge()工作起来没有问题,数据被插入到数据库中,这是系统输出:
其次受影响较大的是金融体系,过去那么多年金融体系受益于低利率、信贷宽松、影子银行大扩张等,金融企业疯狂的扩张资产负债表,一个个都赚的钵满盆满(看看过去数年金融企业的疯狂高利润和增速,从业人员增速和工, [99][297]现在,如果我注释掉B1和B2,并取消注释A1和A2:
salesOrderModel.setAddr1(address.getStreet());
String s = address.getStreet();
try {
System.out.println(s + ", " + "[" + s.length() + "][" + s.getBytes("UTF-8").length + "]");
} catch (Exception e) {
e.printStackTrace();
}我收到了post开头提到的异常,这是系统输出:
Plaça Pla de L'Estany, 5, Edificio Vueling Airlines S.A., [113][115]字符串长度为113。
如果我这样做:
String s = "Plaça Pla de L'Estany, 5, Edificio Vueling Airlines S.A.";输出结果为:
Plaça Pla de L'Estany, 5, Edificio Vueling Airlines S.A., [56][57]现在字符串长度是56 (vs 113)。为什么?
发布于 2017-01-26 20:46:39
最后我终于发现了问题所在,我犯了一个愚蠢的错误!
字符串对于字段来说确实太长了。基本上,该字符串包含两行Plaça Pla de L'Estany, 5, Edificio Vueling Airlines S.A.,直到现在我才注意到它。
我的错!
https://stackoverflow.com/questions/41852037
复制相似问题