WE8MSWIN1252字符集的NLS_LENGTH_SEMANTICS

时间:2012-06-15 03:01:01

标签: character-encoding oracle11g database-schema

我们有一个数据库,其中字符集设置为WE8MSWIN1252,我理解这是一个单字节字符集。

我们通过运行带有以下内容的脚本来创建模式及其表:

ALTER SYSTEM SET NLS_LENGTH_SEMANTICS = CHAR

我们是否可能丢失数据,因为我们使用具有字符语义的VARCHAR2列而基础字符集是单字节?

2 个答案:

答案 0 :(得分:2)

如果您使用的是像Windows-1252这样的单字节字符集,那么无论您使用的是字符还是字节语义都无关紧要。每个字符只占用一个字节,因此列是否被声明为VARCHAR2(10 CHAR)VARCHAR2(10 BYTE)并不重要。在任何一种情况下,最多可分配10个字节的存储空间,最多可分配10个字符。

由于您没有从更改NLS_LENGTH_SEMANTICS设置中获益,因此您应该将设置保留为默认设置(BYTE),因为这不太可能导致您可能需要的其他脚本出现问题运行(例如来自Oracle的那些)。

答案 1 :(得分:1)

很好的问题。多字节字符将占用所需的字节数,这可能会使用比预期更多的存储空间。如果在varchar2(4)列中存储4字节字符,则表示已使用全部4个字节。如果在varchar2(4 char)列中存储4字节字符,则只使用1个字符。许多外语和特殊字符使用2字节字符集,因此最好“了解您的数据”并相应地制作数据库列定义。 Oracle建议不要将NLS_LENGTH_SEMANTICS更改为CHAR,因为它会影响定义为CHAR或VARCHAR2的每个新列,可能包括进行就地升级时的目录表。你可以看出为什么这可能不是一个好主意。其他Oracle工具集和接口也可能存在问题。