Oracle 정의 varchar2 () 형식의 한자 길이 저장 문제

2561 단어
우선 varchar2 () 의 기본 자료를 찾아봤습니다.
1.varchar2            (     ),varchar              ,  ,           ;
2.VARCHAR2      null  , varchar       ;
3.VARCHAR2          ,           ,
          varchar2  ,          。

oracle의 varchar2(4000)는 jdbc의thin 드라이브를 통해 연결되는데 왜 666개의 한자만 저장할 수 있습니까?
누가 666개의 한자만 저장할 수 있다고 했습니까?varchar2는 최대 4000바이트입니다. oracle 문자 집합을 보십시오. 문자 집합이 16비트 인코딩, ZHS 16GBK이면 문자마다 16비트, 2바이트이기 때문에 2000문자를 수용할 수 있습니다.32비트 인코딩 문자 세트의 경우 1000자만 저장할 수 있습니다.뒤에 있는 예의length(문자 길이)와lengthb(바이트 길이)의 차이를 보면 알 수 있다.create table T_BOARD( NAME      VARCHAR2(50) insert into      T_BOARD values('테스트');select      t.name,length(t.name),lengthb(t.name) from t_board t
문자 집합은 varchar2의 길이를 결정합니다
질문 설명: intert into TBOARD values('17개 이상의 한자');오류: 삽입 문자가 너무 깁니다!한자 하나가 3바이트를 차지하는 것을 발견하여 오보!!!문제: 사용한 문자 집합이 UTF8이면 이 오류가 발생할 수 있습니다!명령을 사용하여 보려면 다음과 같이 하십시오.
SQL> select parameter,value from nls_database_parameters where parameter like 'NLS_CHARACTERSET';
PARAMETER ------------------------------------------------------------ VALUE -------------------------------------------------------------------------------- NLS_CHARACTERSET AL32UTF8
해결 방법: ZHS 16GBK 문자 세트를 사용하는 것이 좋습니다!작업: SQL>SHUTDOWN IMEDIATE,                                     SQL> STARTUP MOUNT;                                    SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;                                    SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;                                    SQL> ALTER DATABASE OPEN;                                    SQL> ALTER DATABASE CHARACTER SET AL32UTF8/ZHS16GBK;
                                  SQL> SHUTDOWN IMMEDIATE;
                                  SQL> STARTUP; 문제 해결!!!(변경할 때 새로운 문자 집합이 낡은 초집합 문제임을 주의한다)
참고 1:
리: 연구: 왜 나의 ORACLE 데이터 조작이 갑자기 수량 제한의 오류를 보고했습니까(괴)?
발표 시간: 2003-12-05 09:25
이것은 매우 고전적인 OracleJDBC 문제다.일반적으로 ps.setString()로 문자열 데이터를 직접 설정할 때 Oracle의 JDBC 드라이브는 중국어를 2바이트나 3바이트로 변환하여 고정되지 않기 때문에 경계를 자주 넘는다.만약 ps.setCharacterStream () 로 바꾸면 중국어마다 두 바이트가 고정되어 있습니다
oracle의 문서에 따르면thin의 jdbc 드라이브는 문자 집합에 따라varchar2의 길이를 결정합니다. ascii나 라틴 문자 집합이 아니라면 길이의 제한은 2000입니다. 다른 문자 집합은 두 바이트로 저장해야 한다고 생각하기 때문입니다. 그러나 jdbc의 setString 방법을 통해 드라이브는 자바의 utf-16을utf-8로 변환합니다.이렇게 하면 영어는 두 바이트에서 한 바이트로, 중국어는 두 바이트에서 세 바이트로 바뀌기 때문에 2000/3은 대략 666개의 중국어 문자가 된다.
참고 2:
업데이트 작업 시 방법: pstmt.setBytes(4,aimString.getBytes());
데이터를 찾을 때: new String(result Set.getBytes("field Name"), "ISO-8859-1"),

좋은 웹페이지 즐겨찾기