以前遇到這類問題第一個反應就是覺得客戶端和服務端的編碼不一樣導致的。所以一開始也是那麼認為的。以為我們項目使用的是pgsql,默認的就是utf-8,然後我們使用了字符也是utf-8,並且還有一個問題就是說一般的string類型(數據庫映射為varchar)顯示的是正常的,然後我就有些抓不著頭腦了,去google和百度都沒有找到合適的答案。都沒有解決。
問題是我們在JPA項目中使用了@Lob注解。這個注解的解釋是這樣的:
@Lob 注解屬性將被持久化為 Blog 或 Clob 類型。
但是很可惜,我明明是String類型的,但是還是亂碼
@Lob @Basic(fetch=FetchType.LAZY) private String content;
,我們再去看數據庫,發現數據庫中的類型是text的,那估計應該是@Lob注解影響到了,也就是說我們要讓數據庫生成text類型的字段,但是同時又不能夠使用這個注解,所以自然想到@Column中有一個columnDefinition屬性,可以指定類型,那麼ok,我們現在把@Lob注解去掉,改成
@Basic(fetch=FetchType.LAZY) @Column(columnDefinition="TEXT") private String content;
,然後我們再來看的時候發現,亂碼就沒有了。