2010-10-08 59 views
4

使用NLS_LENGTH_SEMANTICS = BYTE的Unicode(多字節字符集)Oracle數據庫看起來像是一場等待發生的災難。大多數應用程序中的字段驗證只檢查字符數是否在界限內,而不是數據庫默認字符編碼方案中的字節序列長度!如果你有一個Unicode數據庫,是否有充分的理由使用NLS_LENGTH_SEMANTICS = BYTE而不是CHAR?是否有任何情況下您會在Unicode數據庫上使用NLS_LENGTH_SEMANTICS = BYTE?

+1

字節語義是一種災難;上週有點過了。但是CHAR語義只能解決這麼多問題。 「獨立於字符的最大長度,VARCHAR2數據的長度不能超過4000 ** **字節**」。 (強調已添加)對於足夠大的字符串,您可以在達到列中指定的大小限制之前達到允許的最大空間。引用自:http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/sql_elements001.htm#i45694 – 2010-10-08 23:24:55

回答

2

這只是遺產,我想。有很多舊的應用程序一直在字節上工作,如果這種變化可能會感到困惑。如果索引在其下面重新定義,那麼任何字節串和索引都會跳轉到以字節爲單位的外部應用程序/語言將以奇怪和不可預知的方式出錯。

我不會使用新的應用程序的字節語義,我同意這不是一個好的默認值。但是希望你使用的是NVARCHAR,它避免了這個問題(因爲它總是基於字符)。

+1

具體而言,我知道Oracle上的Crystal Management Server(用於配置數據庫)需要NLS_LENGTH_SEMANTICS = BYTE 。它拋出一個合適的,直到你到SP2。解決方法是應用於水晶用戶的登錄觸發器。 – REW 2010-10-10 05:38:46

相關問題