簡體   English   中英

加載 UTF-8 時出現數據庫錯誤 Java 中的編碼 XML 數據

[英]Database error while loading UTF-8 Encoded XML Data in Java

我正在在這里集思廣益我的問題,不確定這是否會觸發大量關閉!

簡化:我有一個系統讀取 XML 文件並將其加載到數據庫中。

XML 具有以下架構:

<?XML version="1.0" encoding="UTF-8"?>

罪魁禍首字段具有以下架構摘錄:

<xsd:simpleType name="title">
.....
<xsd:restriction base="xsd:string">
 <xsd:minLength value="1"/>
 <xsd:maxLength value="2000"/>
</xsd:restriction>

該模式與 UTF-8 兼容,因此應支持 2000 個 UTF-8 字符,無論它們是單字節、雙字節還是多字節。

XML 模式已經進行了字符長度檢查,如上面摘錄中所定義。

問題有時是 XSD 驗證成功,但數據庫插入失敗,當“標題”字段中出現一些多字節 UTF-8 字符時,服務器崩潰並出現 DB 錯誤。

The database 'title' column is defined as `varchar(2000)`

當數據庫插入操作失敗時,ops需要手動減少XML字段的長度並重新處理XML文件來修復它。

我一直在研究:

  • 字節與字符長度檢查
  • 模式驗證
  • ETC

解決方案是否可以進行與字符計數匹配的字符串字節計數檢查?

我可以在 Java 中執行 string.getBytes("UTF-8").length ,但是如何匹配 XSD 和varchar(2000)中的<xsd:maxLength value="2000"/>

您建議如何確保標題字段的 XML 數據不超過指定長度,如 XSD 中定義的那樣。 並且只要符合 XSD 就可以成功地將 XML 數據插入 DB?

我是否正確假設 XSD 中的<xsd:maxLength value="2000"/>varchar(2000)列定義匹配?

該架構符合 UTF-8

不完全是,但我想我知道你的意思。 您引用的 XML 聲明未指定與此架構匹配的 XML 實例文檔的任何內容。 簡單來說就是 XSD本身(即帶有根標簽 <xs:schema> 的 XML 文檔)使用 UTF-8 作為其字符編碼。

XML 架構從不關心 XML 文檔的原始字節。 正在驗證的是 XML 信息集。 因此,簡單類型的 maxLength 方面表示您在此字段中最多可以有 2000 個字符 正如您正確指出的那樣,字節的實際長度很容易超過 2000 個字符,但 XML 處理器不會知道或關心。

有時 XSD 驗證成功,但數據庫插入失敗

我同意 lunatikz - 最可能的解釋是數據庫配置不正確。

解決方案是否可以進行與字符計數匹配的字符串字節計數檢查?

不,那將解決錯誤的問題。 問題可能出在數據庫中,而不是在您的 Java 代碼中。

您建議如何確保標題字段的 XML 數據不超過指定長度,如 XSD 中定義的那樣。

我認為你不需要做任何事情來確保這一點。 您的 XML 驗證器已經在為您檢查,它可能工作得很好。

並且只要符合 XSD 就可以成功地將 XML 數據插入 DB?

配置數據庫或其表/列定義,使其停止嘗試使用單字節字符編碼來解釋輸入。

我是否正確假設 XSD 中的 <xsd:maxLength value="2000"/> 與 varchar(2000) 列定義匹配?

是的,兩者都指定了最多 2000 個字符的字段。 但是數據庫以與 XML 處理器不同的方式解釋“字符”一詞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM