Character encoding WE8MSWIN1252字符集的哪个NLS_长度_语义

Character encoding WE8MSWIN1252字符集的哪个NLS_长度_语义,character-encoding,oracle11g,database-schema,Character Encoding,Oracle11g,Database Schema,我们有一个数据库,其中字符集设置为WE8MSWIN1252,据我所知是一个单字节字符集 我们通过运行包含以下内容的脚本来创建架构及其表: ALTER SYSTEM SET NLS_LENGTH_SEMANTICS=CHAR 由于我们使用的是具有字符语义的VARCHAR2列,而基础字符集是单字节的,我们可能会丢失数据吗?如果您使用的是像Windows-1252这样的单字节字符集,那么您使用的是字符语义还是字节语义是无关的。每个字符只占用一个字节,因此声明一个列是VARCHAR2(10个字符)还是V

我们有一个数据库,其中字符集设置为WE8MSWIN1252,据我所知是一个单字节字符集

我们通过运行包含以下内容的脚本来创建架构及其表:

ALTER SYSTEM SET NLS_LENGTH_SEMANTICS=CHAR


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

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


由于更改
NLS\u LENGTH\u语义设置对您没有好处,您应该将该设置保持为默认值(
BYTE
),因为这不太可能导致您可能需要运行的其他脚本出现问题(例如来自Oracle的脚本)。

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

如果它们不使用单字节字符集会怎么样?