我们有一个拥有NLS_CHARACTERSET = US7ASCII
。
作为测试,我们在包含VARCHAR(4000)
字段的表中运行了一个插入,因为能够在该列中放置CHR(176)
值(degrees symbol
)。
US7ASCII
似乎不支持该字符。
为什么数据库允许将该值存储在该列中?
答案 0 :(得分:1)
它有效,因为以下条件都是正确的:
您的数据库字符集和客户端字符集设置为US7ASCII
。在这种情况下,每个数据被逐个写入/读取而没有任何转换,即您发送的字节被精确写入数据库。可能您没有在客户端设置NLS_LANG
,但Oracle默认为AMERICAN_AMERICA.US7ASCII
。
US7ASCII
是一个7位编码。我假设一个纯ASCII应用程序(可能很难找到)只会忽略存储在8位架构中的第8位。其他字符集,例如AL32UTF8
不允许每个字节值。在这种情况下,这些字符将被占位符替换,例如占位符。 ¿
或?
。
注意,您将客户端字符集设置为US7ASCII
,这很可能不正确。将其正确设置为应用程序使用的字符集,然后°
将被替换。
如果您使用SQL * Plus,请使用命令chcp
检查控制台代码页,resp。 locale charmap
。在启动sqlplus之前,相应地设置NLS_LANG
环境变量。
答案 1 :(得分:0)
数据库允许存储该值,因为Oracle将为您处理字符集转换。
可以在此处找到更多信息:Special Characters in Oracle