1. 程式人生 > 實用技巧 >sql server 資料庫查詢 json 資料亂碼

sql server 資料庫查詢 json 資料亂碼

sql server 資料庫使用正常,頁面沒有亂碼,但是在一張表裡的一個屬性(屬性型別:varchar(max))存放了 json 字串,並且查出來後就是亂碼,導致反 json 序列化報如下錯:

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('≻' (code 8827 / 0x227b)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
 at [Source: (String)"≻敲瑣晩捩瑡潩䵮慥畳敲≳∺ꊷ쓎ꊷ쓎ꆰⰢ瀢慬䍮浯汰瑥呥浩≥∺〲〲〭ⴹ㌲ㄠ㨲〰〺∰�"; line: 1, column: 2]
	at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1804)
	at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:693)
	at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:591)
	at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddValue(ReaderBasedJsonParser.java:1902)
	at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:757)
	at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:4141)
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4000)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3004)

解決方法是將儲存 json 字串的屬性型別改成:nvarchar(max)。

varchar 儲存的是非 Unicode 的字元。

nvarchar 儲存的是 Unicode 字元。

那為什麼其它 varchar 屬性的中文沒有亂碼呢,可能是由於資料庫設定的字元編碼是 Chinese_PRC_CI_AS 中文字符集。

select SERVERPROPERTY(N'edition') as Edition --資料版本,如企業版、開發版等
,SERVERPROPERTY(N'collation') as Collation --資料庫字符集
,SERVERPROPERTY(N'servername') as ServerName --服務名
,@@VERSION as Version --資料庫版本號
,@@LANGUAGE AS Language --資料庫使用的語言,如us_english等

SELECT COLLATIONPROPERTY( 'chinese_prc_ci_as', 'codepage' )