2015年9月23

我的理解有三个地方的字符集,这三个地方的字符集一致,就不会乱码了。

1、oracle服务器端(服务端数据库字符集,这个一般装数据库的时候就确定的)

2、sqlplus的客户端客户端操作系统参数NLS_LANG

3、客户端操作系统字符集客户端操作系统字符集

关于这个内容,这个作者整理的很好,网址链接->oracle 字符集问题

1、oracle服务器端(服务端数据库字符集,这个一般装数据库的时候就确定的)

首先用sys用户登陆oracle

sqlplus /nolog

SQL>conn sys/newer as sysdba;

查看服务器端字符集:

影响Oracle数据库字符集最重要的参数是NLS_LANG参数。

它的格式如下: NLS_LANG = language_territory.charset

它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。

其中:

Language: 指定服务器消息的语言, 影响提示信息是中文还是英文

Territory: 指定服务器的日期和数字格式,

Charset: 指定字符集。

如:AMERICAN _ AMERICA.UTF8。

select userenv('language') from dual;

看输出的字段值,我的AMERICAN_AMERICA.UTF8。


修改开始

先停止本数据库服务:

SQL>shutdown immediate;

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

这些信息是更改正确字符集后的提示信息,一般应该是英文的)

再启动数据库

SQL>startup   restrict;   此处要注意启动方式要加 restrict参数

ORACLE 例程已经启动。


Total System Global Area  603979776 bytes

Fixed Size                  1220796 bytes

Variable Size             180358980 bytes

Database Buffers          415236096 bytes

Redo Buffers                7163904 bytes

数据库装载完毕。

数据库已经打开。


修改字符集

SQL> alter session set sql_trace=true;


  Session altered.


SQL> alter system enable restricted session;


  System altered.


SQL> alter system set job_queue_processes=0;


  System altered.


SQL> alter system set aq_tm_processes=0;


    System altered.


SQL> alter database open;


  Database altered.


SQL> alter database character set UTF8;

   Database altered.


有时执行alter database character set UTF8;语句时会报错:


ORA-12712: new character set must be a superset of old character set


意思是新字符集不是原字符集超集,例如原字符集为ZHS16CGB231280,新字符集zhs16gbk,虽然新字符集比原字符集大,但不存在父子关系,通过以下语句会跳过超集检查:


SQL> alter database character set INTERNAL_USE UTF8;  


重启数据库


SQL> shutdown immediate;


SQL> startup;

没错误提示就成功了。

2、sqlplus的客户端(客户端操作系统参数NLS_LANG)

修改注册表(cmd>regedit)里的HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOME0下,NLS_LANG=SIMPLIFIED CHINESE_CHINA.UTF8。

再此查看服务器端和客户端字符集设置应该已经修该过来了。

3、客户端操作系统字符集(客户端操作系统字符集)

修改sqlplus字符集,在环境变量中配置一个系统变量,变量名="NLS_LANG",变量值="AMERICAN_AMERICA.UTF8"

这三个地方修改好之后。我的oracle就没有乱码了。

ORA-01008,提示信息:并非所有变量都已经绑定。

今天玩数据库的时候:

String sql = "insert into jmt_nm(nm_id,name,content,photo) "

+ "values(scott_seq_jmt_nm.nextval,?,?,?)";

try {

ps = this.conn.prepareStatement(sql);

ps.setString(1, nm.getName());

ps.setString(2, nm.getContent());

ps.setString(3, nm.getPhoto());

System.out.println(sql);

                                if(ps.executeUpdate(sql)>0){ 

flag=true;

}

if里面老是报错,ORA-01008,提示信息:并非所有变量都已经绑定。

后来终于明白了,ps.executeUpdate(sql)  把括号里的sql去掉就可以了.

java享元模式

个人理解:有时候为了节约内存空间,有些东西只需要实例化一次,共享使用。

复用我们内存中已存在的对象,降低系统创建对象实例的性能消耗。

享元模式的使用场景:

1、当我们发现某个类型的对象有大量的实例时,我们是否可以对这些实例进行分类,经过分类后,我们发现只有很少的类别的情况下。

2、我们发现通过使用享元模式后能够提高系统的性能和不会带来更多的复杂度时。

      享元模式一般是给出本地内存资源节省的一个方案,并不适合互联网上的分布式应用的情况,不过享元模式对于排他性的要求资源的控制,是个不错的选择的。

----------------------   

单例模式:  

    单例模式有以下特点:

  1、单例类只能有一个实例。

  2、单例类必须自己创建自己的唯一实例。

  3、单例类必须给所有其他对象提供这一实例。

  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例


你可能感兴趣的:(JAVA享元模式,解决oracle乱码问题,oracle设置字符集)