用のMySQL 5.7の私の窓の上のマシン 春ブーツ1.4.0 RELEASE MySQLのJDBCドライバが5.1です。 39春ブーツ - JPAのHibernate - MysqlのUTF8によって引き起こさ:com.mysql.jdbc.MysqlDataTruncation:データの切り捨て:データ長すぎる列
私はテーブルがあり、いくつかのVARCHARカラムを持ち、それらはすべてVARCHAR(100)に設定されています。 エンコーディングはテーブルのためにENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
に設定されます。
私はMYSql Workbenchを使用すると、英語以外の文字(中国語など)を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
私はURLにuseUnicode=true&connectionCollation=utf8_general_ci&characterSetResults=utf-8&characterEncoding=utf-8
を追加しようとしました、私は
その後、私のapplication.yamlなど、運にconnectionProperty useUnicode=true;characterEncoding=utf-8;
を追加しようとしました@Configuration
へ@EnableAutoConfiguration
を変更して、これを追加します。
@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();
}
それでも同じものを持っています!
私は今... :-(私は私が作った単純なミスでなければならないと思いますが、間違いが何であるか、その上に2日間を過ごし
おかげ
編集:?ちょうど保存しようとしましたがエンティティマネージャがUTF8を処理するために設定する必要のあるプロパティはありますか?
編集:これまでより多くのデバッグコードを追加しました。問題はJPAや休止状態とは関係ありません。
私が得ている文字列は、SOAP呼び出しからmagento SOAP APIへのものです。
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();
}
そして私はポストの冒頭で述べた例外を受け、これは、システムの出力です:
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(対113)であります。どうして?
so ... mySqlworkbenchを使用すると、スプリングとスプリングのブートを使用している間にレコードを追加することができます(私は間違っていないとチャイニーズ)。右?それはそうだ...私は、JavaからDB層へのエンコードが来て、あなたの中国語の文章が(おそらくUTF-8)エンコードされていると思うし、100文字以上になる。完全なSQL文もログに記録してください(paramsも) –
@TheMW 'Charset.defaultCharset()'はあなたがこれを実行するマシン上で何を表していますか? 'getBytes()。length'は、デフォルトの文字セットの出力をバイト単位で表示します。たとえば、 "MaïÜÜa" .getBytes(StandardCharsets.UTF_16LE).length'は16バイトを表示します... – Eugene
@Angelo Immediata正解ですが、私はmysqlworkbenchではできますが、javaではできませんが、Javaでは、長さは115であり、getBytes()によると115文字です。長さ –