您可以插入和检索 Unicode 数据。数据在数据库和客户端程序之间进行字符集透明转换,确保客户端程序独立于数据库字符集和国家字符集。

Unicode 数据会使用国家字符集,由参数 NLS_NCHAR_CHARACTERSET 指定。

在 SQL 和 PL 语句中表示 Unicode 字符

在 SQL 或 PL 语句中表示 Unicode 字符串的方法为:N’string’。例如:N’中’ 。

示例:在 SQL 中表示 Unicode 字符

  1. obclient> select N'中' , dump(N'中',16), dump('中',16) from dual;
  2. +--------+---------------------+------------------------+
  3. | N'中' | DUMP(N'中',16) | DUMP('中',16) |
  4. +--------+---------------------+------------------------+
  5. | | Typ=44 Len=2: 4e,2d | Typ=23 Len=3: e4,b8,ad |
  6. +--------+---------------------+------------------------+
  7. 1 row in set (0.01 sec)
  8. obclient> show variables where variable_name in ('nls_characterset','nls_nchar_characterset');
  9. +------------------------+-----------+
  10. | VARIABLE_NAME | VALUE |
  11. +------------------------+-----------+
  12. | nls_characterset | AL32UTF8 |
  13. | nls_nchar_characterset | AL16UTF16 |
  14. +------------------------+-----------+
  15. 2 rows in set (0.00 sec)

在字符集转换中避免数据损失

作为 SQL 或 PL 语句的一部分,文本(带有或不带有前缀N)都与语句其余部分使用相同的字符集编码。 在客户端,语句按客户端字符集编码,由 NLS_LANG 参数决定。在服务器端,语句按数据库字符集编码。

当 SQL 或 PL 语句从客户端发往数据库端时,会相应的发生字符集转换。如果数据库字符集不包含客户端语句中的所有文本字符,在转换过程中就会发生语句数据丢失。比如,NCHAR 类型文本就比 CHAR 类型文本更脆弱一些,因为前者设计上是独立于数据库字符集的。