2010-10-08 36 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

相关问题