안녕하세요

프로그램 과정에서 막혔던 문제들에 대한 해결책 정리


페이지 목록

2011년 7월 20일 수요일

MySQL Data Type 정리

Integer Type
- TINYINT  128부터 127 까지의 정수형 타입,   부호가 없는 정수 0∼255까지 지원 
- SMALLINT  32768부터 32767 까지의 정수형 타입,  부호가 없는 정수 0∼65535까지 지원 
- MEDIUMINT  8388608부터 8388607 까지의 정수형 타입,   부호가 없는 정수 0∼16777215까지 지원 
- INT 또는 INTEGER   -2147483648부터 2147483647까지의 정수형 타입,
      부호 없는 정수 0∼4294967295까지 지원 
- BIGINT  9223372036854775808 부터 9223372036854775807 까지의 정수형 타입 
       부호 없는 정수 0∼18446744073709551615까지 지원 
- FLOAT(M,D) 단정도 부동 소수점 실수,   -3.402823466E+38 ∼ -1.175494351E-38  
  그리고 1.175494351E-38 ~ 3.402823466E+38까지  M은 숫자 전체의 길이, D는 소수점 자리수를 의미 
- DOUBLE(M,D) 2 배 정밀도를 가진 부동 소수점 실수,   -1.79769313486231517E+308 ∼ 2.22507385850720E+308


Stirng Type
-CHAR(m) 0~255까지 입력이 가능하며, 길이가 m길이만큼 고정 사이즈가 된다.
-
VARCHAR (m)0~255까지 입력은 가능하지만, 길이는 고정이 아닌 가변 사이즈이다.
-
BINARY(m) 이진 데이터를 바이트 지정한 만큼 고정 길이
-
VARBINARY(m) 이전 데이터를 바이트 지정한 만큼 넣는다. 가벼 길이
-TINYBLOB 이전 데이터를 최대 255자까지 입력이 가능하다
-
BLOB 최대 길이가 63535인 문자를 저장
-
TEXT 최대 길이가 63535인 문자를 저장
-MEDIUMBLOB 최대 길이가 16777215인 문자를 저장
-LONGBLOB 최대 입력이 4G 이진데이타, 최대 2^32 바이트
-
LONGTEXT 최대 입력이 4G 1바이트 문자열, 최대 2^32 자
/*  Point */
  - BLOB타입은 대소문자를 구분하고 TEXT타입은 대소문자를 구분하지 않는점이 틀림
  - MySQL 3.23.2이번 버전에서는 BLOB와 TEXT컬럼에는 인덱스를 만들수 없다
  - BLOB와 TEXT컬럼의 저장시에 문자열 됫부분의 공백이 제거되지 않는다.
  - BLOB와 TEXT컬럼은 DEFAULT를 지정할 수 없다.

Data Type
-DATE 날짜를 표현하는 유형 [YYYY-MM-DD], 1000-01-01 ∼ 9999-12-31까지 나타낼 수 있다
-DATETIME 날짜와 시간을 표현하는 유형 [YYYY-MM-DD HH:MM:SS],  1000-01-01 00:00:00 ∼ 9999-12-31 23:59:59
-TIMESTAMP 자동변경 컬럼 타입(4 Byte ),  1970-01-01 00:00:00부터 2037년 까지 표현
-TIME 시간을 표현하는 유형 [HH:MM:SS],   839:59:59 ∼ 833:59:59 까지 표현
-
YEAR 년도를 표현하는 유형[기본적으로 4자리로 사용],  1901년 ∼ 2155년

JDBC 사용방법


//STEP 1. Import required packages
import java.sql.*;

public class JDBCExample {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/STUDENTS";

   //  Database credentials
   static final String USER = "username";
   static final String PASS = "password";
   
   public static void main(String[] args) {
   Connection conn = null;
   Statement stmt = null;
   try{
      //STEP 2: Register JDBC driver
      Class.forName("com.mysql.jdbc.Driver");

      //STEP 3: Open a connection
      System.out.println("Connecting to a selected database...");
      conn = DriverManager.getConnection(DB_URL, USER, PASS);
      System.out.println("Connected database successfully...");
      
      //STEP 4: Execute a query
      System.out.println("Creating table in given database...");
      stmt = conn.createStatement();
      
      String sql = "CREATE TABLE REGISTRATION " +
                   "(id INTEGER not NULL, " +
                   " first VARCHAR(255), " + 
                   " last VARCHAR(255), " + 
                   " age INTEGER, " + 
                   " PRIMARY KEY ( id ))"; 

      stmt.executeUpdate(sql);
      System.out.println("Created table in given database...");
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{
         if(stmt!=null)
            conn.close();
      }catch(SQLException se){
      }// do nothing
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try
   System.out.println("Goodbye!");
}//end main
}//end JDBCExample

CHAR 와 VARCHAR의 차이점

CHAR는 고정형이고, VARCHAR는 가변형이라는 정도의 지식만 가지고 데이터베이스를 다루는 한국어권 사용자들을 위해, MySQL 레퍼런스 문서의 해당 내용을 번역해보았다. 

mysqlkorea에서도 본 내용을 번역하여 게시하고 있지만, 의역이 마음에 들지 않고 일부 삭제된 부분이 있어 다시 번역했다. mysqlkorea의 문서는 다음 링크를 통해 열람할 수 있다. 


아래 문서를 읽는 것 조차 귀찮은 분들을 위해 내용을 요약하고, 첨언하면 다음과 같다.
  • CHAR형은 고정형. 최대 길이는 255.
  • VARCHAR형은 가변형. 최대 길이는 255, MySQL 5.0.3 이후부터는 65,535까지 가능.
  • VARCHAR형은 255글자 이하에는 1바이트, 그 이상은 2바이트의 추가 공간을 필요로 한다.
  • 4.1 이후 버전부터는 CHAR(n), VARCHAR(n)에서 n은 바이트가 아니라, 글자 수를 의미. 즉, 캐릭터 셋의 영향을 받는다.
  • 문자열 뒤에 이어지는 공백들은 열의 형태/버전/SQL 모드에 따라 다르게 처리될 수 있다.
  • 임의의 바이트 배열을 저장할 때에는 BLOB를 선택하라.
  • CHAR / VARCHAR형을 비교하거나 정렬할 때에 뒤따르는 공백은 무시된다. 인덱스도 마찬가지.
  • VARCHAR형이 포함된 열을 삭제/갱신 하는 경우에는 테이블에 사용되지 않는 파편이 생길 수 있다. 이와 같은 가변 길이 행 형태의 테이블은 가끔 OPTIMIZE TABLE [tablename]을 통해 파편을 제거하여 디스크 용량 절약(테이블 스페이스를 쓰지 않는 경우)과 읽기 속도의 개선을 꾀할 수 있다.


10.4.1. CHAR 와 VARCHAR 형

CHAR와 VARCHAR 형은 유사하지만, 저장하고 읽어들이는 부분에는 다르다. MySQL 5.0.3 이후로는 최대 길이와 남은 공간의 보관 여부에 대해서도 달라졌다.
CHAR와 VARCHAR형은 보관하고자 하는 문자열의 최대 길이를 포함하여 선언하게 된다. 예를 들어, CHAR(30)은 30 글자까지 보관할 수 있다.
CHAR열의 길이는 테이블을 만들 때에 지정한 길이로 고정되며, 길이는 0부터 255까지 가능하다. CHAR값을 저장할 때는 문자열의 우측에 공백을 넣어 지정된 길이에 맞추게 된다. 값을 읽어들일 때에는 공백을 제거해서 읽는다.
VARCHAR열의 값은 가변 길이 문자열이다. 지정할 수 있는 길이는 0부터 255까지이며, MySQL 5.0.3 이후에는 0부터 65,535까지 지정할 수 있다. MySQL 5.0.3 이후 버전에서의 VARCHAR 유효 최대 길이는 최대 열 크기(최대 65,535바이트)와 캐릭터 셋의 사용에 영향을 받는다. 
CHAR형과는 다르게, VARCHAR형은 1바이트 혹은 2바이트의 값을 앞부분에 저장하며, 이는 값의 크기가 몇 바이트인지 나타낸다. 255글자 이하일 때는 1바이트, 그 이상이면 2바이트를 차지한다.
엄격한 SQL 모드(strict SQL mode)가 활성화되지 않은 상태에서, 열의 최대 길이를 초과하여 값을 저장하면, 값을 잘라서 보관하고 경고를 발생시킨다. 엄격한 SQL 모드를 활성화하면 공백이 아닌 문자열을 자를 때에 경고 대신 에러를 발생시키고 값을 추가하지 못하도록 할 수 있다. 자세한 내용은 다음 링크를 참고한다. Section 5.1.6, “Server SQL Modes”.
VARCHAR열에 해당 열의 길이를 초과하는 공백들은 SQL 모드에 관계없이 잘린 후 저장되며, 경고를 발생시킨다. CHAR열의 경우에는 마찬가지로 동작하지만, 경고가 발생하지 않는다.
VARCHAR 값은 저장될 때에 공백이 추가되지 않는다. 뒤따르는 공백에 대한 처리는 버전에 따라 다르다.  MySQL 5.0.3부터는 표준 SQL과의 호환성을 위해 뒤따르는 공백들을 제거하지 않고 보관하며, 읽어들일 때도 보존해준다. MySQL 5.0.3 이전에는 저장될 때에 뒤따르는 공백들은 제거되었고, 이는 값을 읽어들일 때에도 제거된 채로 읽힘을 의미한다.
MySQL 5.0.3 이전에 뒤따르는 공백들을 유지하기 위해서는 BLOB나 TEXT 형을 선택해야 했다. 또한, 암호화된 값이나 압축 기능을 통해 얻어진 임의의 바이트 형태의 값을 보관할 때에는 CHAR나 VARCHAR형 보다는 BLOB를 선택하는 것이, 데이터의 변형을 가져올 공백 제거에 따른 잠재적인 문제점으로부터 피할 수 있게 해준다.
다음 표는 문자열을 CHAR(4)와 VARCHAR(4) 열에 보관할 때의 결과를 통해 CHAR와 VARCHAR 형의 차이점을 보여준다. (모든 열은 latin1과 같은 1바이트 캐릭터 셋을 사용하는 것으로 가정한다.)
CHAR(4)필요한 저장소 크기 VARCHAR(4)필요한 저장소 크기
'''    '4 bytes''1 byte
'ab''ab  '4 bytes'ab'3 bytes
'abcd''abcd'4 bytes'abcd'5 bytes
'abcdefgh''abcd'4 bytes'abcd'5 bytes
마지막 열의 값은 엄격한 SQL 모드를 사용하지 않을 때만 적용된다. 만약 엄격한 SQL 모드로 MySQL이 동작한다면, 길이를 초과하는 값을 저장되지 않고 에러를 발생시키게 된다.
CHAR 열은 값을 읽을 때, 뒤의 공백을 제거하기 때문에, CHAR(4)와 VARCHAR(4)에 주어진 값과 읽었을 때 얻어진 값은 항상 같지는 않다. 다음은 이 차이를 보여주는 예제이다.
mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO vc VALUES ('ab  ', 'ab  ');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
+---------------------+---------------------+
| CONCAT('(', v, ')') | CONCAT('(', c, ')') |
+---------------------+---------------------+
| (ab  )              | (ab)                |
+---------------------+---------------------+
1 row in set (0.06 sec)

CHAR와 VARCHAR 열에 쓰여진 값들을 정렬하거나 비교할 때에는 해당 열이 가지고 있는 캐릭터 셋 - 콜레이션(collation)의 영향을 받는다. 모든 MySQL의 콜레이션은 PADSPACE이다. 이는 MySQL의 CHAR와 VARCHAR 값들은 뒤따르는 공백의 영향 없이 비교될 수 있음을 의미한다.
mysql> CREATE TABLE names (myname CHAR(10), yourname VARCHAR(10));
Query OK, 0 rows affected (0.09 sec)

mysql> INSERT INTO names VALUES ('Monty ', 'Monty ');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT myname = 'Monty  ', yourname = 'Monty  ' FROM names;
+--------------------+----------------------+
| myname = 'Monty  ' | yourname = 'Monty  ' |
+--------------------+----------------------+
|                  1 |                    1 |
+--------------------+----------------------+
1 row in set (0.00 sec)
VARCHAR열에 값을 저장하기 전에 공백을 제거하는 MySQL 버전을 사용하고 있어도, SQL 모드의 활성 또는 비활성화되어 있어도 관계가 없으며, 모든 MySQL 버전에 해당한다. 
알림
MySQL 캐릭터 셋과 콜레이션은 다음을 참고한다. Section 9.1, “Character Set Support”.
이 같은 경우에 대해 뒤따르는 공백들은 제거되거나 비교 시에 무시하게 되므로, 해당 열이 유일한 인덱스(unique index)를 요구하는 경우에, 뒤따르는 공백의 수만 다르고 내용이 같은 문자열들을 입력하면 중복키 에러를 발생시킨다. 예를 들어, 해당 테이블이 'a'를 가지고 있는 상태에서 'a '를 저장하려 하면 중복키 에러가 발생한다.

2011년 6월 3일 금요일

자바 특수문자 사용방법

특수문자 처리와  자바에서의 파일 패스에 대한 포스팅 (\ , /)

  1. 특수문자를 처리하는 방법
자바의 특수문자 처리는 아래와 같이 하는데 퍼온건데 출처를 잃어버림
1. []으로 싸주면 문자자체로 인식하는 것들. 
*  ⇒ [*] 
+  ⇒ [+] 
$  ⇒ [$] 
|  ⇒ [|] 
2. \\를 붙여줘야 하는 것들. 
( ⇒ \\( 
) ⇒ \\) 
{ ⇒ \\{ 
} ⇒ \\} 
^ ⇒ \\^ 
[ ⇒ \\[ 
] ⇒ \\]
3. 자바의 특수문자는 \을 쓴다. 
 " ⇒ \" 
4. 나머지 부호들은 괜찮은 듯 하다. 
확인된 것. 
! # % & @ ` : ; - . < > , ~ ' 
ex ) 위에 놈들 다 지워 보자.
    String c = "!\"#$%&(){}@`*:+;-.<>,^~|'[]"; 
   c = c.replaceAll("!\"#[$]%&\\(\\)\\{\\}@`[*]:[+];-.<>,\\^~|'\\[\\]", ""); 

 public static String getSTRFilter(String str){ 
  int str_length = str.length(); 
  String strlistchar   = ""; 
  String str_imsi   = "";  
  String []filter_word = {"","\\.","\\?","\\/">\\~","\\!","\\@","\\#","\\$","\\%","\\^","\\&","\\*","\\(","\\)","\\_","\\+","\\=","\\|","\\\\","\\}","\\]","\\{","\\[","\\\"","\\'","\\:","\\;","\\<","\\,","\\>","\\.","\\?","\\/"}; 
  for(int i=0;i<filter_word.length;i++){ 
   //while(str.indexOf(filter_word[i]) >= 0){ 
      str_imsi = str.replaceAll(filter_word[i],""); 
      str = str_imsi; 
   //} 
  } 
  return str; 

 } 

2.path에 대한 ..
"\' 를 / 로 바꾸어야 하는데.
일반적으로 생각 하듯이
private String getJabaPath(String original){
// file:/ path가 되게 변경
System.out.println("trans start");
String result= "file:/";
result +=original.replaceAll("\\", "/");
System.out.println("trans end");
return result;
}
하였더니 오류가 난다 .
unexpected internal error 란다.
해결은 
private String getJabaPath(String original){
// file:/ path가 되게 변경
System.out.println("trans start");
String result= "file:/";
result +=original.replaceAll("\\\\", "/");
System.out.println("trans end");
return result;
}
로 한다.
이유는 특수문자를 처리하기 위해서는 \을 붙이는데 \을 특수문자로 처리하는 특수문자이기 때문에 \\\을 해야 인식이 된다.

2011년 5월 4일 수요일

tomcat에서 server.xml 수정 불가 시 대처 방법

 server.xml 파일을 수정할 수 있는 액세스가 거부되었습니다.

라는 메세지를 받았습니다.

관리자 권한을 받아서 해결해야 되더군요.

관련 사이트 : http://drparksc.blog.me/20108932847

위 방법으로 해결 될 줄 알았으나

위 방법은 (아마) 접근 불가능 했던 폴더에 접근하게 해주는 기능에

국한 되어 있는 듯 하다.

server.xml 등 여러 가지 system 파일을 변경하기 위해서는

시작 버튼에서 메모장을 오른쪽 클릭하여

관리자 권한으로 열기를 클릭하여

관리자 권한을 얻어야 한다.

참조 사이트: http://blog.daum.net/pcvill/18251040