您可以插入和检索 Unicode 数据。数据在数据库和客户端程序之间进行字符集透明转换,确保客户端程序独立于数据库字符集和国家字符集。
Unicode 数据会使用国家字符集,由参数 NLS_NCHAR_CHARACTERSET 指定。
在 SQL 和 PL 语句中表示 Unicode 字符
在 SQL 或 PL 语句中表示 Unicode 字符串的方法为:N’string’。例如:N’中’ 。
示例:在 SQL 中表示 Unicode 字符
obclient> select N'中' , dump(N'中',16), dump('中',16) from dual;
+--------+---------------------+------------------------+
| N'中' | DUMP(N'中',16) | DUMP('中',16) |
+--------+---------------------+------------------------+
| 中 | Typ=44 Len=2: 4e,2d | Typ=23 Len=3: e4,b8,ad |
+--------+---------------------+------------------------+
1 row in set (0.01 sec)
obclient> show variables where variable_name in ('nls_characterset','nls_nchar_characterset');
+------------------------+-----------+
| VARIABLE_NAME | VALUE |
+------------------------+-----------+
| nls_characterset | AL32UTF8 |
| nls_nchar_characterset | AL16UTF16 |
+------------------------+-----------+
2 rows in set (0.00 sec)
在字符集转换中避免数据损失
作为 SQL 或 PL 语句的一部分,文本(带有或不带有前缀N)都与语句其余部分使用相同的字符集编码。 在客户端,语句按客户端字符集编码,由 NLS_LANG 参数决定。在服务器端,语句按数据库字符集编码。
当 SQL 或 PL 语句从客户端发往数据库端时,会相应的发生字符集转换。如果数据库字符集不包含客户端语句中的所有文本字符,在转换过程中就会发生语句数据丢失。比如,NCHAR 类型文本就比 CHAR 类型文本更脆弱一些,因为前者设计上是独立于数据库字符集的。