我们有一个数据库,其中的字符集设置为WE8MSWIN1252,据我所知,这是一个单字节字符集。
我们通过运行包含以下内容的脚本创建了一个架构及其表:
更改SYSTEM SET NLS_LENGTH_SEMANTICS=CHAR
我们可能会丢失数据吗,因为我们使用的是带有字符语义的VARCHAR2列,而底层字符集是单字节的?
发布于 2012-06-15 11:11:12
如果您使用的是像Windows-1252这样的单字节字符集,那么您使用的是字符语义还是字节语义都无关紧要。每个字符只占用一个字节,因此列是声明为VARCHAR2(10 CHAR)还是VARCHAR2(10 BYTE)并不重要。在任何一种情况下,都将分配最多10个字节的存储空间,最多可存储10个字符。
由于更改NLS_LENGTH_SEMANTICS设置没有任何好处,因此应该将该设置保留为缺省值(BYTE),因为这不太可能导致您可能需要运行的其他脚本(例如来自Oracle的脚本)出现问题。
发布于 2013-03-29 02:15:35
问得好。多字节字符将占用所需的字节数,这可能会占用比预期更多的存储空间。如果在varchar2(4)列中存储一个4字节的字符,则已使用了全部4个字节。如果在varchar2(4个字符)列中存储4字节字符,则仅使用了1个字符。许多外语和特殊字符使用2字节字符集,因此最好“了解您的数据”,并相应地定义数据库列。Oracle不建议将NLS_LENGTH_SEMANTICS更改为CHAR,因为这将影响定义为CHAR或VARCHAR2的每个新列,在执行就地升级时可能包括目录表。您可以明白为什么这可能不是一个好主意。其他Oracle工具集和界面也可能会出现问题。
https://stackoverflow.com/questions/11044086
复制相似问题