2017-01-25 7 views
2

用の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)であります。どうして?

+0

so ... mySqlworkbenchを使用すると、スプリングとスプリングのブートを使用している間にレコードを追加することができます(私は間違っていないとチャイニーズ)。右?それはそうだ...私は、JavaからDB層へのエンコードが来て、あなたの中国語の文章が(おそらくUTF-8)エンコードされていると思うし、100文字以上になる。完全なSQL文もログに記録してください(paramsも) –

+0

@TheMW 'Charset.defaultCharset()'はあなたがこれを実行するマシン上で何を表していますか? 'getBytes()。length'は、デフォルトの文字セットの出力をバイト単位で表示します。たとえば、 "MaïÜÜa" .getBytes(StandardCharsets.UTF_16LE).length'は16バイトを表示します... – Eugene

+0

@Angelo Immediata正解ですが、私はmysqlworkbenchではできますが、javaではできませんが、Javaでは、長さは115であり、getBytes()によると115文字です。長さ –

答えて

0

最後に私は問題を見つけました。私の愚かな間違いです!

文字列の長さが実際には長すぎます。基本的に文字列にはPlaça Pla de L'Estany, 5, Edificio Vueling Airlines S.A.の2行が含まれていますが、今まで気づいていませんでした。

私の悪い!

関連する問題