在任何数据库中存储生僻字,其实都和一个因素有关:字符集。
能否正常存储一个字符,首先是要看要存储的字符在数据库的当前字符集中是否能够表达。如果包含在数据库字符集中,则能够正常存储。如果字符集不支持,可以看国家字符集是否支持,通常这两者可以解决大多数问题。
但是注意,很多时候,本应正常存储的字符,可能在写入过程中,因为环境问题转换错误,丢失了正确的字符,而出现乱码。
标题中出现的生僻字读音:㼆 yíng ,㱔 suǒ,䶮 yǎn
*乱码的情况*
我们首先举一个例子:本应正常存储的字符,因为环境问题而出现乱码。
示范数据库的字符集:
SQL> select name,value$ from sys.props$ where name like '%CHARACTERSET';
NAME
--------------------------------------------------------------------------------
VALUE$
--------------------------------------------------------------------------------
NLS_NCHAR_CHARACTERSET
AL16UTF16
NLS_CHARACTERSET
AL32UTF8
创建测试表,插入一个汉字。
SQL> create table mogdb (cname varchar2(20));
Table created.
SQL> insert into mogdb values('㼆');
1 row created.
SQL> select * from mogdb;
CNAME
--------------------
???
注意,此时的查询结果显示乱码,以问号形式输出。我们可以通过dump函数查看底层存储的真实编码:
SQL> select dump(cname,1016) from mogdb;
DUMP(CNAME,1016)
--------------------------------------------------------------------------------
Typ=1 Len=9 CharacterSet=AL32UTF8: ef,bf,bd,ef,bf,bd,ef,bf,bd