Oracle 是否存在在Unicode数据库上使用NLS_LENGTH_SEMANTICS=BYTE的情况?

Oracle 是否存在在Unicode数据库上使用NLS_LENGTH_SEMANTICS=BYTE的情况?,oracle,unicode,character-encoding,Oracle,Unicode,Character Encoding,拥有一个NLS_LENGTH_SEMANTICS=byte的Unicode(多字节字符集)Oracle数据库似乎是一场即将发生的灾难。大多数应用程序中的字段验证只检查字符数是否在范围内,而不是数据库默认字符编码方案中的字节序列长度!如果你有一个Unicode数据库,是否有充分的理由使用NLS_LENGTH_SEMANTICS=BYTE而不是CHAR?我认为这只是遗留问题。很多旧的应用程序总是使用字节,如果这种情况发生变化,它们可能会感到困惑。如果在字节字符串和索引下重新定义了索引,那么任何以字节

拥有一个NLS_LENGTH_SEMANTICS=byte的Unicode(多字节字符集)Oracle数据库似乎是一场即将发生的灾难。大多数应用程序中的字段验证只检查字符数是否在范围内,而不是数据库默认字符编码方案中的字节序列长度!如果你有一个Unicode数据库,是否有充分的理由使用NLS_LENGTH_SEMANTICS=BYTE而不是CHAR?

我认为这只是遗留问题。很多旧的应用程序总是使用字节,如果这种情况发生变化,它们可能会感到困惑。如果在字节字符串和索引下重新定义了索引,那么任何以字节为单位工作的外部应用程序/语言的字节字符串和索引都将以奇怪和不可预测的方式出错


我不会在新应用程序中使用字节语义,我同意这不是一个好的默认值。但希望您使用的是NVARCHAR,它可以避免这个问题(因为它总是基于字符)。

字节语义是一场灾难;上个星期被那个咬了一口。但CHAR语义只能解决这么多问题。“与字符的最大长度无关,VARCHAR2数据的长度不能超过4000字节。”(强调添加)对于足够大的字符串,在达到列上指定的大小限制之前,可以达到允许的最大空间。引用自:具体来说,我知道Oracle上的Crystal Management Server(用于配置数据库)需要NLS_LENGTH_SEMANTICS=BYTE。在你到达SP2之前,它会让你大发雷霆。解决方法是应用于crystal用户的登录触发器。