[英]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文件來修復它。
我一直在研究:
解決方案是否可以進行與字符計數匹配的字符串字節計數檢查?
我可以在 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.