如果我们有US7ASCII字符,为什么它让我们存储非ascii字符?

时间:2017-10-31 15:59:46

标签: oracle unicode ascii

我们有一个拥有NLS_CHARACTERSET = US7ASCII

的Oracle数据库

作为测试,我们在包含VARCHAR(4000)字段的表中运行了一个插入,因为能够在该列中放置CHR(176)值(degrees symbol)。

US7ASCII似乎不支持该字符。

为什么数据库允许将该值存储在该列中?

2 个答案:

答案 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