728x90
반응형

Jakarta POI

 

 

I. POI 란?

 

일반적으로 POI가 엑셀파일을 쓰는 컴퍼넌트로 알려져 있으나 POI는 프로젝트 이름입니다.
즉 POI는 Microsoft Format File을 액세스 할 수 있는 API를 제공합니다. (한마디로 자바에서 MS파일을 읽고 쓸수있도록 지원합니다.)

 

POI안에는 여러 컴퍼넌트들이 있습니다.

① POIFS 
Microsoft의 OLE2 포맷 형식의 문서를 자바로 읽고 쓸수 있는 컴퍼넌트입니다
기본적으로 POI의 모든 컴퍼넌트들이 POIFS를 사용합니다.
② 
HSSF
Microsoft의 엑셀파일을 읽고 쓸수 있도록 지원하는 컴퍼넌트입니다.
③ 
HWPF
Microsoft의 워드파일을 읽고 쓸수 있도록 지원하는 컴퍼넌트입니다.
이 컴퍼넌트는 디자인 초기단계입니다.
④ 
HPSF
Microsoft의 OLE2 포맷 형식의 문서 속성을 어플리케이션에서 사용 할수 있도록 지원하는 컴퍼넌트입니다.
현재 읽기 기능만 제공합니다

 

워드파일을 핸들링 하는 HWPF는 초기단계라 사용을 못하지만 기대는 되는군요 ^^

 

ps. 영어사전을 찾아보니 poi는 하와이의 토란 요리를 뜻하더군요.

우리나라말로 하니 자카르타 토란 프로젝트 쯤 될라나? ㅎㅎ

 

 

II. 다운로드 및 설치

 

다운로드 받으러 갑시다~!

http://jakarta.apache.org/site/downloads/downloads_poi.cgi

현재 2.5.1버젼입니다.

다운받은 파일을 압축을 풀면 *.jar 파일들이 있을겁니다 이 파일들을 자신의 어플리케이션 /lib/에 복사합시다

 

POI API http://jakarta.apache.org/poi/apidocs/index.html

Quick Guide http://jakarta.apache.org/poi/hssf/quick-guide.html

 

 

III. Formula(수식) 지원에 관해..

 

엑셀을 읽고 쓸때 수식을 지원합니다. 
org.apache.poi.hssf.usermodel.HSSFCell의 setCellFormula("formulaString") 메쏘드는 스프레드시트에 수식을 추가하는데 사용되며 getCellFormula() 메쏘드는 수식을 대표하는 문자열을 해석하는데 사용됩니다. 하지만 엑셀에서 사용하는 수식을 모두 사용 할 수는 없습니다.

 

 지원되는 부분
-. 셀 참조, 시트참조, 지역참조
-. 상대적 혹은 절대적 참조 
-. 수연산 및 논리연산
-. 시트 혹은 매크로 함수

-. 수식 결과값 반환

 

 부분적 지원
문자열을 포함하는 수식을 해석할 수는 있지만 문자열값을 반환하는 수식은 아직 지원하지 않습니다.

 지원되지 않는 부분

-. 배열 수식 
-. 1진법 수식
-. 3D 참조
-. 에러 값 (cells containing #REF's or #VALUE's)


 

IV. 기본객체


가장 기본이되는 객체가 다음 4가지 입니다

이름에서 무엇을 뜻하는지 대강 짐작 할 수 있겠죵?

 

 HSSFWorkbook - 엑셀 워크북을 말합니다.
 HSSFSheet - 엑셀 쉬트를 나타냅니다.
 HSSFRow - 엑셀에서 특정 행입니다.
 HSSFCell - 엑셀에서 특정 행에대한 특정 셀입니다

 

위 4가지 객체는 앞으로 계속 나올겁니다. 눈여겨 미리 봐 둡시다. @.@

 

 

V. 엑셀 읽기 예제

 

① POSFS을 이용하여 엑셀 워크북을 생성합니다.

 

POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("excelfile.xls"));
HSSFWorkbook workbook = new HSSFWorkbook(fs);

 

 

 생성된 워크북을 이용하여 시트 수만큼 돌면서 엑셀 시트 하나씩을 생성합니다.

 

int sheetNum = workbook.getNumberOfSheets();

for (int k = 0; k < sheetNum; k++) {
   System.out.println("Sheet Number : "+k);

   System.out.println(Sheet Name : " + workbook.getSheetName(k));
   HSSFSheet sheet = workbook.getSheetAt(k);

}

 

 

 생성된 시트를 이용하여 그 행의 수만큼 돌면서 행을 하나씩 생성합니다.

 

int rows = sheet.getPhysicalNumberOfRows();

for (int r = 0; r < rows; r++) {
   HSSFRow row   = sheet.getRow(r);

   System.out.println("Row : "+row.getRowNum());

}

 

 

 역시나 생성된 행을 이용하여 그 셀의 수만큼 돌면서 셀을 하나씩 생성합니다.

 

int cells = row.getPhysicalNumberOfCells();

for (short c = 0; c < cells; c++) {              <--!! short 형입니다. 255개가 max!
    HSSFCell cell  = row.getCell(c);

    int celltype = cell.getCellType();

    ...

}

셀을 생성하여 셀 타입에 따라 처리를 해주면 끝~

 

 주의사항

만약 엑셀에서 A열에 아무런 값이 없으면 그 행은 읽지 못합니다.

행을 읽지 못하니 셀또한 처리 할 수 없습니다

 

 

VI. 엑셀읽기 샘플소스

 

샘플 데이터

 

 

 

 

 

 

 

A열은 B열에 대한 셀 타입을 나타내며 C열은 D열에대한 셀 타입을 나타냅니다.

즉 B:1 의 123456의 셀 타입은 A:1 일반 이라는 것이며 마찬가지로

D:1의 2005-02-09의 셀타입은 C:1 사용자정의로 세팅하였다는 겁니다

 

이 엑셀의 데이터를 다음 소스로 읽어 보겠습니다.

 

<%@ page
language="java"
contentType="text/html;charset=euc-kr" 
import="java.io.*,
 org.apache.poi.poifs.filesystem.POIFSFileSystem,
 org.apache.poi.hssf.record.*,
 org.apache.poi.hssf.model.*,
 org.apache.poi.hssf.usermodel.*,
 org.apache.poi.hssf.util.*" %>

 

<html>
<head><title>Read example</title></head>
<body>

<%

  String excelfile = "C:\\Tomcat 5.0\\webapps\\ROOT\\example.xls";

  try {
       POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(excelfile)); 

 

       //워크북을 생성!               

       HSSFWorkbook workbook = new HSSFWorkbook(fs);

       int sheetNum = workbook.getNumberOfSheets();

 

       for (int k = 0; k < sheetNum; k++) {

 

            //시트 이름과 시트번호를 추출
%>

            <br><br>
            Sheet Number <%= k %> <br>
            Sheet Name <%= workbook.getSheetName(k) %><br>
<%
            HSSFSheet sheet = workbook.getSheetAt(k);
            int rows = sheet.getPhysicalNumberOfRows();

 

            for (int r = 0; r < rows; r++) {

 

                // 시트에 대한 행을 하나씩 추출
                HSSFRow row   = sheet.getRow(r);
                if (row != null) { 
                     int cells = row.getPhysicalNumberOfCells();
%>
                     ROW  <%= row.getRowNum() %> <%=cells%></b><br>
<%

                     for (short c = 0; c < cells; c++) {

 

                         // 행에대한 셀을 하나씩 추출하여 셀 타입에 따라 처리
                         HSSFCell cell  = row.getCell(c);
                         if (cell != null) { 
                              String value = null;

                              switch (cell.getCellType()) {

                                   case HSSFCell.CELL_TYPE_FORMULA :
                                       value = "FORMULA value=" + cell.getCellFormula();
                                        break;
                                   case HSSFCell.CELL_TYPE_NUMERIC :
                                       value = "NUMERIC value=" + cell.getNumericCellValue(); //double
                                       break;
                                  case HSSFCell.CELL_TYPE_STRING :
                                       value = "STRING value=" + cell.getStringCellValue(); //String
                                       break;
                                  case HSSFCell.CELL_TYPE_BLANK :
                                      value = null;
                                     break;
                                 case HSSFCell.CELL_TYPE_BOOLEAN :
                                     value = "BOOLEAN value=" + cell.getBooleanCellValue(); //boolean
                                    break;
                                case HSSFCell.CELL_TYPE_ERROR :
                                     value = "ERROR value=" + cell.getErrorCellValue(); // byte
                                     break;
                                default :
                             }
%>         
                          <%= "CELL col=" + cell.getCellNum() + " VALUE=" + value %> <br>
<%
                        } 
                    }
                }
            }
       }
   } catch (Exception e) {
%>
       Error occurred:  <%= e.getMessage() %>
<%   
       e.printStackTrace();
    }

%>


</body>
</html>

 

위 소스의 결과입니다.

 

Sheet Number 0 
Sheet Name 한글
ROW 0 4
CELL col=0 VALUE=STRING value=일반 
CELL col=1 VALUE=NUMERIC value=123456.0 
CELL col=2 VALUE=STRING value=사용자정의 
CELL col=3 VALUE=NUMERIC value=38392.0 
ROW 1 4
CELL col=0 VALUE=STRING value=숫자 
CELL col=1 VALUE=NUMERIC value=123456.0 
CELL col=2 VALUE=STRING value=날짜 (yy-m-d h:mm) 
CELL col=3 VALUE=NUMERIC value=38393.0 
ROW 2 4
CELL col=0 VALUE=STRING value=통화 
CELL col=1 VALUE=NUMERIC value=123456.0 
CELL col=2 VALUE=STRING value=날짜 (yy年 mm月 dd日) 
CELL col=3 VALUE=NUMERIC value=38394.0 
ROW 3 4
CELL col=0 VALUE=STRING value=텍스트 
CELL col=1 VALUE=NUMERIC value=123456.0 
CELL col=2 VALUE=STRING value=날짜 (yyyy년 mm월 dd일) 
CELL col=3 VALUE=NUMERIC value=38395.0


 

결과를 보니 사용자가 지정한 셀 타입에 관계없이

숫자관련 셀은 POI에서 모두 숫자 타입으로 인식해 버렸습니다.

날짜 역시 지정한 셀 타입에 관계없이 모두 숫자 타입으로 인식해 버리는군요!

그럼 어떻게 날짜를 제대로 표현할까요?

날짜 타입을 제대로 나타내기 위해서는 날짜 Cell에는 getDateCellValue()를 사용하면

정상적으로 처리 할 수 있습니다.

SimpleDateformat sdf = new SimpleDateformat("yyyy-MM-dd hh:mm");
String date = sdf.format(cell.getDateCellValue());

등을 이용하면 나타내고자 하는 알짜를 표현 하기 더 쉽겠지요

나머지 수식을 가져 올때도 마찬가지입니다. 이런 사항을 도표로 나타내보았습니다.

 

org.apache.poi.hssf.usermodel.HSSFCell 에는 모두 6가지의 Cell Type이 있는데,

cell.getCellType()을 하면 그 셀의 반환값을 알 수 있으며 그에 상응하는 static 필드타입은 다음과 같습니다.

 

셀타입 필드타입

함수

함수반환값
0 CELL_TYPE_NUMERIC

getNumericCellValue()

-> 숫자 타입일때

getDateCellValue()

-> 날짜 타입일때

double

 

Date

 

1 CELL_TYPE_STRING

getStringCellValue()

String
2 CELL_TYPE_FORMULA

getCellFormula()

-> 수식자체를 가져올때

getNumericCellValue()

-> 수식 반환값이 숫자일때

getStringCellValue()

-> 수식 반환값이 문자일때

String

 

double

 

String

3 CELL_TYPE_BLANK

 

 

4 CELL_TYPE_BOOLEAN

getBooleanCellValue()

boolean
5 CELL_TYPE_ERROR

getErrorCellvalue()

byte

 

이번시간에는 POI 프로젝트를 이용하여 엑셀 파일을 읽어보았습니다. 다음 시간에는 엑셀파일에 쓰는 핸드링을 해 보도록 하지요~

출처 : [기타] 블로그 집필 - 민군네집

728x90
반응형
728x90
반응형



자바를 사용하다보면 사이트에서 이런저런 요청사항들이 많이 들어오게 마련입니다..

 

특히나 엑셀에 대한 요청도 많이 들어오게되죠..

 

프레임웍중에서 이런 기능을 제공하는것들이 있는지에대해선 잘 모르겠지만...(이전 MiPlatform에서는 제공해주던데..)

 

아래 방법은 apache의 POI를 사용하여, java로 구현한 프로그램입니다.

 

API를 보다보면 수많은 인터페이스와 클래스.. 그에대한 메서드들이 있는데..

 

JXL은 사용하기 쉬운반면, 상대적으로 적은API를 제공하고, POI는 어려운반면무궁무진한 기능을 구현할수있는 API를 제공합니다.

 

또 보다보면 그렇게 어렵지도 않아요..

 

라이브러리는 마지막으로 9월에 릴리즈된버전입니다.

 

POI에 대한 자세한 설명은 poi.apache.org에 가시면 많은 자료들이 있습니다.

 

이 아래 예제는 만들어진 excel파일이 있고, 그 excel파일 안에 있는 값들을 읽는것입니다.

 

주석까지 다 달아놨으니 보기 편할겁니다..

 

아래는 소스입니다.

============================================================================================

 

 

import java.io.*;

import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.hssf.record.*;
import org.apache.poi.hssf.model.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.*;

public class aas{

 public aas(){
  String excelFile = "d:\\test.xls"; //excel파일의 경로와 파일명
  
  try{
   POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(excelFile)); //엑셀파일의 경로와 이름을 통해 POIFSFileSystem을 생성
   
   //워크북을 생성!
   HSSFWorkbook workbook = new HSSFWorkbook(fs); //파일에 대한 워크북을 생성
   int sheetNum = workbook.getNumberOfSheets(); //그파일의 워크시트의 수를 가져온다
   
   for(int k = 0;k < sheetNum; k++){    //시트를 돌면서 모든 데이터를 얻는다.
    //시트이름과 시트번호를 추출
    System.out.println(k);      //시트의 index를 콘솔에 출력
    System.out.println(workbook.getSheetName(k)); //시트의 이름을 콘솔에 출력
    HSSFSheet sheet = workbook.getSheetAt(k);  //한개의 시트에대한 정보를 HSSFSheet형의 변수에 담는다.
    int rows = sheet.getPhysicalNumberOfRows();  //시트별 몇개의 row가 있는지 알아낸다.
    
    for(int r= 0; r<rows;r++){
     //시트에 대한 행을 하나씩 추출
     
     HSSFRow row = sheet.getRow(r);  //한개의 시트에 몇개의 로우가 있는지 체크  
     if(row != null){    //로우가 비어있지않다면
      int cells = row.getPhysicalNumberOfCells();  //한개의 로우마다 몇개의 cell이 있는지 체크
      System.out.print(row.getRowNum());   //row의 index를 콘솔에 출력
      System.out.println(cells);     //해당 row에 대한 cell의 갯수를 콘솔에 출력
      
//      for(short c = 0; c < cells; c++){ //셀의 마지막까지 잡는다. 이 부분은 오류가있어 사용하지않는다.
      for(short c = 0; c < 5; c++){ //5개의 칸까지 잡는다.
       //행에대한 셀을 하나씩 추출하여 셀 타입에 따라 처리
       HSSFCell cell = row.getCell(c);  //cell의 index
       
//       System.out.println(row.getPhysicalNumberOfCells());
       if(cell != null){
        String value = null;
        switch(cell.getCellType()){       //셀의 type에 대해 체크하고 type을 설정해준다.
        case HSSFCell.CELL_TYPE_FORMULA:     
         value = "FORMULA value="+cell.getCellFormula();
         break;
        case HSSFCell.CELL_TYPE_NUMERIC:
         value = "NUMERIC value="+cell.getNumericCellValue();
         break;
        case HSSFCell.CELL_TYPE_STRING:
         value = "STRING value="+cell.getStringCellValue();
         break;
        case HSSFCell.CELL_TYPE_BLANK:
         value = null;
         break;
        case HSSFCell.CELL_TYPE_BOOLEAN:
         value = "BOOLEAN value="+cell.getBooleanCellValue();
         break;
        case HSSFCell.CELL_TYPE_ERROR:
         value = "ERROR value"+cell.getErrorCellValue();
         break;
         default:
        }
        
        System.out.println("CELL col="+cell.getCellNum() + " VALUE="+value); //셀에대한 값을 콘솔에 출력해준다.
        
       }
      }
     }
    }
   }
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 public static void main(String[] args)throws Exception{
  aas aas = new aas();
 }//main
}//class

 

============================================================================================

 

아래는 대상 excel파일의 구조입니다.

 

 

============================================================================================

아래는 프로그램의 결과물입니다.

 

0
Sheet1
04
CELL col=0 VALUE=NUMERIC value=1.0
CELL col=1 VALUE=NUMERIC value=1.0
CELL col=2 VALUE=NUMERIC value=1.0
CELL col=3 VALUE=NUMERIC value=1.0
14
CELL col=0 VALUE=NUMERIC value=2.0
CELL col=1 VALUE=NUMERIC value=2.0
CELL col=2 VALUE=NUMERIC value=2.0
CELL col=3 VALUE=NUMERIC value=2.0
24
CELL col=0 VALUE=NUMERIC value=3.0
CELL col=1 VALUE=NUMERIC value=3.0
CELL col=2 VALUE=NUMERIC value=3.0
CELL col=3 VALUE=NUMERIC value=3.0
34
CELL col=0 VALUE=NUMERIC value=4.0
CELL col=1 VALUE=NUMERIC value=4.0
CELL col=2 VALUE=NUMERIC value=4.0
CELL col=3 VALUE=NUMERIC value=4.0
44
CELL col=0 VALUE=NUMERIC value=5.0
CELL col=1 VALUE=NUMERIC value=5.0
CELL col=2 VALUE=NUMERIC value=5.0
CELL col=3 VALUE=NUMERIC value=5.0
54
CELL col=0 VALUE=STRING value=한글1
CELL col=1 VALUE=STRING value=한글2
CELL col=2 VALUE=STRING value=한글3
CELL col=3 VALUE=STRING value=한글4
66
CELL col=0 VALUE=STRING value=null
CELL col=2 VALUE=STRING value=null
CELL col=3 VALUE=STRING value=d
CELL col=4 VALUE=STRING value= 
1
Sheet2
2
Sheet3

출처 : [직접 서술] 직접 서술

728x90
반응형
728x90
반응형
Java Servlet & JSP API 개발/코딩
제목 : Re: MIME타입은 주의해서 사용... 이렇게 하면 어떨지...
글쓴이: 이원영(javaservice) 2000/04/07 19:51:27 조회수:6814 줄수:176
[프린트]
손님:
> 우연치 않게 <제1회 한국 자바개발자 컨퍼런스>안내창을 보구 처음으로 이 사이트를
> 방문하게 됐습니다.......
> 
> 저는 현재 서블릿으로 게시판을 만들고 있는 서블릿 초보자입니다.
> 다른 기능들은 어느 정도 구현을 해놓았는데, 화일 다운로드에서 벽에 부딪히게 돼서
> 도움을 요청하게 됐습니다.
> 
> html, image(jpg/gif), text와 같은 화일 다운로드시 여타 응용 프로그램 화일처럼 
> 다운로드 창이 먼저 떠서 지정디렉토리에 직접 저장이 가능하게 하려구 하는데,
> 그냥 바루 웹상에 뿌려지게 되더군요!
> 
> 제가 알기로는 mime type과 관련이 있는거 같은데, 거의 모든 방법을 동원했지만
> 역부족이더군요.........^^
> 
> 고수님들의 아낌없는 조언을 부탁드립니다.....!!!


게시판의 첨부파일을 클릭할 시 저장토록하는 기능이 필요한가 보네요. 사실 이 부분은
해당 Content에 오른쪽 마우스를 누른 후 "대상 다른이름으로 저장" 을 선택하면 동일한
효과가 나타나죠..
근데, 게시판을 만드는 사람의 입장에서 생각해 보면, 사용자에게 일일이 "오른쪽 마우스
누르세요" 라고 할 수도 없고, 그래서 꼭 찍으면 "저장하기 창"이 나타나는 기능을 구현하고
싶어지게 됩니다.


먼저, 약간의 얘기를 해 보겠습니다.

*.txt 파일을 HTTP URL로 호출해 보면, 브라우져에 그 텍스트 내용이 나타납니다.
이는 웹서버의 MIME 타입에 다음과 같은 설정이 있기 때문입니다.

    text/plain          asc txt

(아파치라는 <apache>/conf/mime.typs 파일입니다. 웹서버마다 조금씩 설정방법이 다릅니다.)

또, *.exe 파일을 HTTP URL로 호출하면 "저장하기" 창이 나타납니다. 이는 MIME 타입이 아래
처럼 설정되어 있기 때문입니다.

    application/octet-stream    bin dms lha lzh exe class


서버측에서 MIME 타입이 결정나면, 웹서버는 HTTP Protocol 상의 HEADER 부분에 그 MIME을
먼저 보내고, BODY부분의 실제 데이타를 보내게 되죠.
또한 브라우져는 넘어오는 HEADER부분을 읽어서 뒤따라오는 DATA의 형식을 판단하게 됩니다.
서버에서 MIME 타입을 설정할 수 있듯이 브라우져에도 마찬가지로 MIME에 대한 적절한 반응을
어떻게 하라라는 부분이 있습니다. 대부분의 사용자는 Install할 때의 Default로 그냥 사용하죠


만약 웹서버의 MIME 타입을 약간 고쳐 보면 어떻게 될 까요? 예를 들어 아래와 같은 부분이
기본적으로 설정되어 있을 겁니다.

    text/plain          asc txt
    application/octet-stream    bin dms lha lzh exe class

여기서 txt 라는 확장자에 대한 MIME 타입을 바꾸어 보겠습니다.    

    text/plain          asc
    application/octet-stream    bin dms lha lzh exe class txt

이렇게 저장하고 웹서버를 내렸다 다시 올린 후, 브라우져에서 호출해 보면, 기존에 *.txt파일이
브라우져에서 그냥 나타났는데, 이젠 "저장하기" 창이 나타나 저장할 수 있을 겁니다.


문제는 *.txt 정도는 이렇게 할 수 있겠는데, *.html, *.gif, *.jpg 조차 바꾸어버리면 어떻게
될까요? 빈대잡으려다 초가삼간 다 태우는 격으로, 웹페이지의 모든 *.html 을 읽으려고 하면
브라우져에 나타나지 않고, "저장하기" 창만 무성하게 나타나게 되죠.

따라서 웹서버의 MIME 타입은 알려지지 않은 특정 확장자에 대해 추가적으로 조심스럽게
등록시켜 주는 정도로 사용해야 합니다. (예: *.java, *.jar, *.cpp )
저 같은 경우 *.jar 를 tar 파일과 동일하게 등록시켜뒀습니다.

    application/x-tar       tar jar

이렇게 함으로써, *.jar 파일을 클릭하면, 압축프로그램이 있다면 그 압축프로그램을 실행 할
것이고, 없다면, 저장하려 하겠죠. 만약 jar 파일에 MIME 타입을 등록시켜주지 않은 상태에서
*.jar 파일을 클릭하면 브라우져에 이상한 글자들로 막 채워 질거예요. 등록되지 않은 MIME 
타입은 기본적으로 text/plain으로 인식하거든요.

따라서 *.html, *.gif, *.jpg 등 첨부파일의 링크를 클릭했을 때, 곧바로 저장하도록 하는
방법은 단순히 MIME 타입만 변경한다고 모든 문제가 해결되지는 않아요. 오히려 엉뚱한
문제를 야기하게 되죠...

그럼 어떻게 해야 하느냐...
자바로 하기 전에 UNIX ShellScript로 CGI를 만들어 설명토록 하겠습니다.

파일로 저장되게 하는 방법은 (누군지도 모르는 PC사용자 브라우져의 MIME 타입을 강제로
변경할 방법은 없고, 결국, 서버에서 MIME 타입이 "application/octet-stream" 로 정의해서
넘겨 주는 수 밖에 없습니다. 기본적으로 브라우져는 "application/octet-stream"에 대해선
저장하도록 반응 하니까요.

(임의의 MIME 타입을 하나 만들어 보낼 수도 있습니다. 브라우져는 이해할 수 없는 MIME 타입에
대해 최초에 저장하겠느냐, 혹은 특정 어플리케이션과 연결하겠느냐 라고 묻거든요. 그러나 이건
바람직한 방법은 아니예요. 그 사람이 실수로 엉뚱한 어플리케이션과 한번 연결하면, 수동으로
고치지 않는 한 계속 그 어플리케이션이 열리게 되니까요. 어쨌거나...)

MIME 타입에 대한 얘기는 아래의 RF1521 을 보시면 잘 설명되어 있습니다
   http://freesoft.org/CIE/RFC/1521/
또, 우리가 관심이 있는 "appliction/octet-stream" 형의 MIME 타입은 아래에 설명되어 있습니다.
   http://freesoft.org/CIE/RFC/1521/32.htm

여기서 관심이 있는 부분만 보면, 만약 웹서버에서 브라우져로 데이타가 아래와 같은 형식으로
Stream이 넘어 오면 "저장하기"창이 뜬다는 것입니다.

---------------------------------------------------------------------
Content-Type: application/octet-stream
Content-Disposition: filename=hello.txt
          <---!! 반드시 빈줄이 하나이상 있어야 함
@#$#@VSGVEY#$%YVRYTY#BY$EV$%GV#YY$%YCFFW$%Y$C$%CYF#$%YT$%Y#$V$YV$#%YVW$
$%WVRV$%ER$%FV$%#TTRYBY%EYB%UR&UIIIYNUBAS$B%^&#*&$#NN#^Q@^!FTR@!^NB^@F
@^BY^E%^YG#V&^@&G@V^!BN*#*#(HBHH&RTV$%WV#$^%F^F#$@V#W$ETCF#$TRF#T#V$TC
^BTYHE$CWERWF#FCYT@$B&IM(*OP>&()P^KR*(I#G!DW%#%FGTEY@F%@D$%@D%%D@%DQ%
@^BTR#$C#RE#FDDW$R@FVTW#$TF#TFW$T@FC#$TCFV
---------------------------------------------------------------------

이제 이러한 일을 하는 Shell Script도 된 CGI 프로그램을 하나 짜볼까요?
이 CGI를 호출하면 file 파라메터로 넘어온 파일을 읽어 브라우져에서 저장시켜주는
역할을 하게 됩니다.

--------------------------------------------------------------
javaservice:/# cd /usr/local/apache/cgi-bin
javaservice:/usr/local/apache/cgi-bin# cat file.cgi
#!/bin/sh
filename=$QUERY_STRING
echo "Content-Type: application/octet-stream"
echo "Content-Disposition: filename=$filename"
echo ""
cat $filename

javaservice:/usr/local/apache/cgi-bin# chmod 755 file.cgi
javaservice:/usr/local/apache/cgi-bin# cat hello.txt
안녕하세요? 이 텍스트 파일은 브라우져에서 
저장하기 창이 팍 생겨 저장할 수 있을 거예요.
프히히....

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

이제, netscape를 이용해 다음 URL을 클릭해 보세요.

     http://javaservice.net/cgi-bin/file.cgi?hello.txt


NOTE: 그러나 Netscape에선 잘 동작하는 데, IE는 너무 smart(!)해서인지
      BODY 부분이 텍스트랍시고, 그냥 브라우져에 뿌려버리네요... 
      Netscape에선 잘 됩니다.

결국, 브라우져는 "아항, MIME 타입이 appliction/octet-stream 이구낭...
음, 파일이름은 'Content-Disposition: filename=' 다음에 있는 걸로 하란 소리군.."
라고 파싱을 하게 됩니다.


이러한 일련의 일을 해 주는 것을 앞에선 CGI를 이용했지만, 동일하게 자바서블렛을
이용해서도 가능합니다.
이 부분은 서블렛을 아시니 직접 해보시지요...


PS: 본 게시판도 그냥 오른쪽 마우스를 눌러 "다른 이름으로 대상 저장"를 선택하도록
    되어 있습니다. 작은 기능엔 별로 신경쓰고 싶지 않군요...
    그냥 첨부파일 링크 바로 위에 "오른쪽 마우스를 눌러 대상저장하기를 하세요"라고
    적으시면 어떨까요?

PS2 : 이러한 부분을 잘 응용하면, DB 에서 쿼리한 Data를 "application/vnd.ms-excel"
    형의 MIME 타입으로 브라우져에게 넘겨주면 브라우져는 MS-EXCEL을 기동하여
    그 데이타를 핸들링하게 할 수도 있습니다.

-------------------------------------------------------  
  본 문서는 자유롭게 배포/복사 할 수 있으나 반드시
  이 문서의 저자에 대한 언급을 삭제하시면 안됩니다
================================================
  이원영(javaservice@hanmail.net)
  236-1, Hyosung-2dong, Kyeyang-gu, Inchun,
  407-042, KOREA
  Phone:(82-32)540-5243, Fax:(82-32)540-5402
  PCS:019-310-7324
================================================

제목 : 성의있는 답변에 감사드립니다!
글쓴이: 황효근(guest) 2000/04/09 16:16:16 조회수:1631 줄수:25
우선 이원영님의 성의있는 답변에 대단히 감사드립니다......!!

답변해 주신 내용은 잘 읽어봤습니다....
저에게는 아주 많은 도움이 된 거 같습니다.

잘못하면 web-server의 mimetype을 건드려서 더 큰일을 낸뻔 했군요....^^;

미처 몰랐는데, 넷스케이프에서는 원래 그 기능이 지원됐었군요?

res.setContentType("application/octet-stream")
------------------------------------------------
위 처럼 설정했을 때 말이죠!

역시 익스플로러에서는 힘든가 봅니다.(서블릿으로 무단히두 애써봤지만......음)

http://altair.chonnam.ac.kr/~his/ezboard2/ezboard.cgi?db=pds&action=list&page=1

그런데, 참고로 위 사이트 게시판에서는 익스플로러에서두
*.html, *.txt, *.jpg/gif 화일들두 다운로드 창을 띄어 주더라구요?

이게 어찌된 일인지........???

암튼 다시한번 감사드립니다.....(_ _)

 
제목 : Re: 파일다운로드 창에서 열기하면 한글이 깨짐
글쓴이: 나오(guest) 2005/08/09 15:18:33 조회수:1861 줄수:116
소스입니다.   
a.jsp 에서 href를 통해 b.jsp를 엽니다.

b.jsp 내용입니다. 
(네이버 블로그 http://blog.naver.com/popo0083/40004670769   
 짜자로니(popo0083) 님 페이지에서 얻었습니다.)
<%@ page import="java.lang.*,java.util.*, java.io.*, java.sql.*"%>
<%
	String file_name = request.getParameter("file_name");
//file_name -> C:/app/aaa/web/files/vender_file/200508/E000074_20050809_6.doc
	StringTokenizer tokenF = null ;
	tokenF = new StringTokenizer(file_name,".") ;
	int ct = tokenF.countTokens();
    String[] sType = new String[ct];
	String[] rType = new String[ct];
	if (ct > 1){
		for(int j=0; tokenF.hasMoreTokens(); j++){
			sType[j] = tokenF.nextToken();
		}
		rType[1] = sType[1];
	}
	//추가	
	if(rType[1].equals("doc")){ response.setContentType("application/msword;charset=MS949"); 
	}else if(rType[1].equals("xls")){ response.setContentType("application/x-msexcel;charset=MS949");
	}else if(rType[1].equals("pdf")){ response.setContentType("application/x-msdownload");
	}else if(rType[1].equals("ppt")){ response.setContentType("application/x-mspowerpoint");
	}else if(rType[1].equals("js")){ response.setContentType("application/x-javascript");
	}else if(rType[1].equals("zip")){ response.setContentType("application/zip");
	}else if(rType[1].equals("gif")){ response.setContentType("image/gif");
	}else if(rType[1].equals("jpeg") || rType[1].equals("jpg") || rType[1].equals("jpe")){ response.setContentType("image/jpeg");
	}else if(rType[1].equals("css")){ response.setContentType("text/css");
	}else if(rType[1].equals("html") || rType[1].equals("htm")){ response.setContentType("text/html");
	}else if(rType[1].equals("xml")){ response.setContentType("text/xml");
	}else{ response.setContentType("application/octet-stream"); 
	}

	//response.setHeader("Content-Disposition", "attachment; file_name=\""+file_name+"\";");
	response.setHeader("Content-Disposition", "attachment; file_name="+file_name+";");
	//response.setHeader("Content-Transfer-Encoding", "binary;");
	response.setHeader("Content-Transfer-Encoding", "ISO-8859-1;");
	//response.setHeader("Content-Length", ""+file.length());
	response.setHeader("Pragma", "no-cache;");
	response.setHeader("Expires", "-1;"); 

    File file = new File(file_name);


	if (file.isFile())
	{
		BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file));
		BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream());
		int read = 0;
		while ((read = fin.read()) != -1)
		{
			outs.write(read);
		}
		outs.close();
		fin.close();
	}

%>



==========================  추가 끝 =================================
  해서....   a.jsp에서 href된 부분을 클릭하면 박스가 나와서 열기,저장,취소가
잘 나옵니다. 열기를 클릭하면 파일형식은 제대로 보입니다. 근데 실제 열기를 수행
하면 글자들이 깨져서 보입니다. 알수 없는 글자들....

이거 어떻게 해결할수 있는지요.

환경은 resin에서 웹,어플리케이션 서버를 돌리고 있습니다.
resin.conf에서 mime를 셋팅하는 방법도 있던데요...

네이버 블로그 
http://blog.naver.com/leejs100/20009011825 에서 퍼옴

<!--MIME Type-->  
   <mime-mapping extension='.hdml' mime-type='text/x-hdml;charset=KS_C 
    _5601-1987' /> 
   <mime-mapping extension='.wbmp' mime-type='image/vnd.wap.wbmp' />  
   <mime-mapping extension='.wml' mime-type='text/vnd.wap.wml' />  
   <mime-mapping extension='.wmlc' mime-type='application/vnd.wap.wmlc '/>  
   <mime-mapping extension='.wmlsc' mime-type='application/vnd.wap.wmls
    criptc' />  
   <mime-mapping extension='.wmls' mime-type='text/vnd.wap.wmlscript' />  
   <mime-mapping extension='.wmlscript' mime-type='text/vnd.wap.wmlscript' />  
   <mime-mapping extension='.ws' mime-type='text/vnd.wap.wmlscript' />  
   <mime-mapping extension='.wsc' mime-type='application/vnd.wap. 
    wmlscriptc' />  
  
   <mime-mapping extension='.si9' mime-type='image/vnd.lgtwap.sis' />  
   <mime-mapping extension='.si7' mime-type='image/vnd.stiwap.sis' />  
  
   <mime-mapping extension='.nbmp' mime-type='image/nbmp' />  
   <mime-mapping extension='.sis' mime-type='image/sis' />  
   <mime-mapping extension='.si6' mime-type='image/si6' />  
   <mime-mapping extension='.toy' mime-type='image/toy' /> 
   <mime-mapping extension='.nsnd' mime-type='audio/nsnd' />  
   <mime-mapping extension='.ma1' mime-type='audio/ma1' />  
   <mime-mapping extension='.ma2' mime-type='audio/ma2' />  
   <mime-mapping extension='.pmd' mime-type='audio/pmd' />  
   <!--MIME Type--> 

이건 왑용이라서 ㅡㅡ;; j2me
저는 servlet이거든요 , j2se 저거를 resin에 추가해야한다면 좀 수정해주세요.

많은 가르침 부탁드립니다. 







728x90
반응형
728x90
반응형
파일 다운로드에서...다운로드 받지 않고 바로 열려면...?

안녕하세요.

 

받을 파일은 전부 pdf 로 되어있습니다. 다운로드 로직을 이용해서 파일 전송이

완료되면 바로 아크로밧리더로 열리게 하고 싶습니다.

 

다운로드는 해당 파일의 고유 아이디를 가지고 서블릿을 호출해서

서블릿내의 로직이 돌아서 클라이언트로 해당 파일을 쏴 줍니다.

 

로직은 많이들 쓰고 있는 아래 로직인데요, 이게...바로 열리지 않고

다운로드 받는 창이 뜨던지 아니면 다운로드를 다 받은 후에 열리지 않고

블랭크 페이지로 표시됩니다.

 

    if (strClient.indexOf("MSIE 5.5") != -1) 
    { 
//     response.setContentType("Content-type: application/pdf;"); 
//     response.setHeader("Content-Disposition","attachment;filename="+fileName+";"); 
    } 
    else 
    { 
     response.setContentType("Content-type: application/pdf;"); 
//     response.setHeader("Content-Disposition",";filename="+fileName+";"); 
    }

 

위 쪽에 걸리면 다운로드 창이 뜨고, 아래쪽에 걸리면 자동으로 다운로드 받은 담에

블랭크페이지가 뜹니다...

 

조언 좀 부탁드립니다..

 

감사합니다.

 

     
Tag  
tag는 게시물의 성격을 나타내는 키워드를 입력하는 공간입니다. 
tag는 login 후 사용하실 수 있습니다.
  • 자문자답입니다.. 
    response.setContentType("Content-type: application/pdf;"); --> Content-type: 부분을 빼야하구.. 

    disposition-type 을 inline 으로 주면 되는군요
  • html
  •  
  • 2003-07-03 10:37:27
  • x
  • disposition-type 은 inline 과 attachment 가 있는데 inline 은 바로 여는 거구...attachment 는 선택의 기회(?)를 주는거라구 RFC1806 에 있군요..
  • html
  •  
  • 2003-07-03 10:39:27
  • x
728x90
반응형
728x90
반응형
mime type 입니다. 

MIME에서 제공하는 content-type에는 'text', 'image', 'audio', 'video', 'message', multipart', 'application'의 총 7가지가 존재하며 각 content-type마다 sub-type이 존재합니다.

Text의 sub-type으로는 'plaintext'와 'richtext'가 존재합니다. 
Image의 sub-type형태로는 'gif'포맷과 'jpeg'포맷이 존재합니다.
Audio의 sub-type으로는 'basic'이 있습니다. 
Video의 sub-type으로 'mpeg'이 존재합니다. 

Application 
액셀 화일이라든지, 파워 포인트 화일등을 표시 할수 있습니다.

Content-Type= text/plain에서 text/plain은 일반적인 평문의 글을 의미하며,html도 이에 해당 합니다.

첫번째줄의 내용은 MIME-Type
두번째줄의 내용은 어떤 화일인지 부연 설명
세번째중의 내용은 화일의 확장자 입니다.
참고 하세요. 
application/acad
AutoCAD drawing files
dwg

application/clariscad
ClarisCAD files
ccad

application/dxf
DXF (AutoCAD)
dxf

application/msaccess
Microsoft Access file
mdb

application/msword
Microsoft Word file
doc

application/octet-stream
Uninterpreted binary
bin

application/pdf
PDF (Adobe Acrobat)
pdf

application/postscript
PostScript, encapsulated PostScript,
Adobe Illustrator
ai, ps, eps

application/rtf
Rich Text Format file
rtf rtf

application/vnd.ms-excel
Microsoft Excel file
xls

application/vnd.ms-powerpoint
Microsoft PowerPoint file
ppt

application/x-cdf
Channel Definition Format file
cdf

application/x-csh
C-shell script
csh csh

application/x-dvi
TeX
dvi dvi dvi

application/x-javascript
JavaScript source file
js

application/x-latex
LaTeX source file
latex

application/x-mif
FrameMaker MIF format
mif

application/x-msexcel
Microsoft Excel file
xls

application/x-mspowerpoint
Microsoft PowerPoint file
ppt

application/x-tcl
TCL script
tcl

application/x-tex
TeX source file
tex

application/x-texinfo
Texinfo (emacs)
texinfo, texi 

application/x-troff
troff file
t, tr, roff t, tr, roff

application/x-troff-man
troff with MAN macros
man 

application/x-troff-me
troff with ME macros
me

application/x-troff-ms
troff with MS macros
ms

application/x-wais-source
WAIS source file
src

application/zip
ZIP archive
zip

audio/basic
Basic audio (usually m-law)
au, snd

audio/x-aiff
AIFF audio
aif, aiff, aifc

audio/x-wav
Windows WAVE audio
wav 

image/gif
GIF image
gif

image/ief
Image Exchange Format file
ief

image/jpeg
JPEG image
jpeg, jpg jpe 

image/tiff
TIFF image
tiff, tif

image/x-cmu-raster
CMU Raster image
ras

image/x-portable-anymap
PBM Anymap image format
pnm

image/x-portable-bitmap
PBM Bitmap image format
pbm

image/x-portable-graymap
PBM Graymap image format
pgm

image/x-portable-pixmap
PBM Pixmap image format
ppm

image/x-rgb
RGB image format
rgb

image/x-xbitmap
X Bitmap image
xbm

image/x-xpixmap
X Pixmap image
xpm

image/x-xwindowdump
X Windows Dump (xwd) 
xwd

multipart/x-gzip
GNU ZIP archive
gzip

multipart/x-zip
PKZIP archive
zip

text/css
Cascading style sheet 
css

text/html
HTML file
html, htm

text/plain
Plain text
txt 

text/richtext
MIME Rich Text
rtx

text/tab-separated- values
Text with tab-separated values
tsv

text/xml
XML document
xml

text/x-setext
Struct-Enhanced text 
etx

text/xsl
XSL style sheet
xsl

video/mpeg
MPEG video
mpeg, mpg, mpe 

video/quicktime
QuickTime video
qt, mov

video/x-msvideo
Microsoft Windows video
avi

video/x-sgi-movie
SGI movie player format
movie
728x90
반응형
728x90
반응형
Package flash.system
Class public final class IME
Inheritance IME Inheritance EventDispatcher Inheritance Object

IME 클래스를 사용하면, 클라이언트 컴퓨터로 실행되고 있는 Flash Player 어플리케이션으로, operating system의 IME 를 직접 조작할 수 있습니다. IME 가 설치(Install) 되고 있는지 어떤지, IME 가 현재 유효하게 되어 있는지 어떤지, 및 어느 IME 가 유효하게 되어 있을까를 조사할 수가 있습니다. Flash Player 어플리케이션으로 IME 를 무효 또는 유효하게 할 수가 있습니다. 또, operating system에 따라서는, 그 외가 한정된 기능을 사용할 수 있습니다.

IME 를 사용하면, 중국어, 일본어, 한국어라고 하는 멀티 바이트의 언어로 ASCII 이외의 캐릭터를 입력할 수 있게 됩니다. IME 의 사용 방법의 상세한 것에 대하여는, 어플리케이션의 개발 대상인 OS 의 메뉴얼을 참조해 주세요. 추가 정보에 대해서는, 다음의 Web 사이트를 참조해 주세요.

IME 가 유저의 컴퓨터로 액티브하지 않는 경우, IME 의 Methods 또는 property의 호출은,Capabilities.hasIME 를 제외해, 실패합니다. IME 를 수동으로 액티브하게 하면, 그 이후의 IME 의 Methods 또는 property의 ActionScript 호출은, 의도했던 대로 동작합니다. 예를 들어, 일본어 IME 를 사용하는 경우, IME 의 Methods 또는 property를 호출하기 전에 액티브하게 할 필요가 있습니다.

다음의 겉(표)에, 이 클래스의 플랫폼별의 대응 상황을 나타냅니다.

기능WindowsMac OSXMac Classic
IME 가 설치(Install) 되고 있는지 어떤지의 확인
   flash.system.Capabilities.hasIME
IME 의 온 / 오프
   flash.system.IME.enabled
IME 의 온 / 오프의 확인
   flash.system.IME.enabled
IME 변환 모드의 취득 또는 설정
   flash.system.IME.conversionMode
대응 ** 불가
변환 대상 string의 IME 에의 송신
   flash.system.IME.setCompositionString()
대응 * 불가 불가
IME 로부터의 변환전의 string의 취득
   flash.system.System.ime.addEventListener
(flash.events.IMEEvent.IME_COMPOSITION, myHandler) 
   flash.system.System.ime.removeEventListener
(flash.events.IMEEvent.IME_COMPOSITION, myHandler)
대응 * 불가 불가
IME 에의 변환 요구의 송신
   flash.system.IME.doConversion()
대응 * 불가 불가

* 일부의 Windows IME 에서는, 상기중 일부 지원(support)하고 있지 않는 조작이 있습니다. 모든 조작을 지원(support)하고 있는 IME 는, 일본어 IME 뿐입니다.

** Macintosh 의 경우는, 일본어 IME 에서만 이러한 Methods가 지원(support)되고 있어 써드파티제의 IME 에서는 지원(support)되고 있지 않습니다.

See also



Public property
 property정의
    conversionMode : String
[static] 현재의 IME 의 변환 모드.
IME
    enabled : Boolean
[static] 시스템 IME 가 유효하게 되어 있든가 (true) 무효가 되어 있는지 (false)를 나타냅니다.
IME
Public Methods
 Methods정의
    doConversion ():void
[static] 현재의 입력 string의 제 1 후보를 선택하도록(듯이) IME 에 지시합니다.
IME
    setCompositionString (composition:String ):void
[static] IME 에의 입력 string를 설정합니다.
IME
이벤트
 이벤트일람정의
    imeComposition 유저가 IME 입력을 완료해, 독해 string가 사용 가능하게 되었을 때에 dispatch합니다. IME
property의 상세
conversionMode property
conversionMode:String   [read-write]

현재의 IME 의 변환 모드. 변환 모드를 나타내는, 다음의 IME 모드 string 정수를 지정할 수 있습니다.

  • ALPHANUMERIC_FULL
  • ALPHANUMERIC_HALF
  • CHINESE
  • JAPANESE_HIRAGANA
  • JAPANESE_KATAKANA_FULL
  • JAPANESE_KATAKANA_HALF
  • KOREAN
  • UNKNOWN 읽기 전용(read-only)의 값이며, 설정할 수 없습니다.

Implements 
    public static function get conversionMode():String 
    public function set conversionMode(value:String ):void 

Throws 
Error — 설정 시행이 성공하지 않았습니다.

See also

enabled property  
enabled:Boolean   [read-write]

시스템 IME 가 유효하게 되어 있든가 (true) 무효가 되어 있는지 (false)를 나타냅니다. IME 가 유효하다라고 나무는 멀티 바이트 입력이 되어, IME 가 무효일 때는 영수입력이 됩니다.

Implements 
    public static function get enabled():Boolean 
    public function set enabled(value:Boolean ):void 

Throws 
Error — 설정 시행이 성공하지 않았습니다.

See also

Methods의 상세
doConversion () Methods
public static function doConversion():void

현재의 입력 string의 제 1 후보를 선택하도록(듯이) IME 에 지시합니다.


Throws
Error — 호출이 성공하지 않았습니다.
setCompositionString () Methods  
public static function setCompositionString(composition:String ):void

IME 에의 입력 string를 설정합니다. 이 string가 설정되면, 유저는 IME 후보를 선택하고 나서, 현재 포커스가 있는 텍스트 필드의 결과를 확정할 수 있습니다.

어느 텍스트 필드에도 포커스가 없는 경우, 이 Methods는 실패해, 에러를 슬로우 합니다.

Parameters
composition:String — IME 에 보내는 string.

Throws
Error — 호출이 성공하지 않았습니다.
이벤트의 상세
imeComposition event 
Event object type: flash.events.IMEEvent 
IMEEvent.type property = flash.events.IMEEvent.IME_COMPOSITION 

유저가 IME 입력을 완료해, 독해 string가 사용 가능하게 되었을 때에 dispatch합니다. IME 는, 통상, 일본어, 중국어, 한국어 등, 표음문자는 아니고 표의 문자를 가지는 언어의 텍스트를 입력하기 위해서 사용됩니다.

imeComposition event object의 type property치를 정의합니다.

이 이벤트에는, 다음의 property가 있습니다.

PropertyValue
bubbles false
cancelable false 는, 캔슬하는 디폴트의 동작이 없는 것을 나타냅니다.
currentTarget event listener로 Event object를 액티브하게 처리하고 있는 object입니다.
target IME object입니다.

See also


728x90
반응형
728x90
반응형

MySQL 사용법 (요약)

이강성

2000.1.26

 

시작하기/끝내기

시작하기

형식 : mysql -h hostname -u user_name -p DBname          

       hostname 의 default : localhost          user_name의 default : login name

    예1) mysql -u guest   # user가 guest이고 password가 없을 경우 (localhost) 
    예1) mysql -h sr.kwangwoon.ac.kr -u guest   # user가 guest이고 password가 없을 경우 
    예2) mysql -u guest -p  # password를 입력해야 함 
           Enter password:******** 
    예3) mysql -u guest  pythonDB
     
    참고) 컴퓨터 sr에서 mysql을 이용하여 연습을 하려면 여기서 사용하는 모든 데이터베이스 명 대신에 
    test를 사용하라. 사용자는 누구라도 되고, 테이블을 만들고 검색하고 삭제할 수 있다. 
    암호는 주어져 있지 않다.
    실행예:  mysql -u guest test

끝내기

    mysql> QUIT 
    mysql> Ctrl-D 
     
    *mysql> 은 프롬프트임

 

패스워드 설정/변경

변경:

    mysql -u root -p
    Enter password:*****
    mysql> use mysql
    mysql> update user set Password=PASSWORD('password') where user='userid';
    mysql> flush privileges;

 

질의 입력하기

버전과 날짜 보기:

* 명령에 대소문자 구분은 없다 (case insensitive). mysql> 은 프롬프트임.
 
    mysql> SELECT VERSION(), CURRENT_DATE;
    +--------------+--------------+
    | version()    | CURRENT_DATE |
    +--------------+--------------+
    | 3.22.20a-log | 1999-03-19   |
    +--------------+--------------+
    1 row in set (0.01 sec)
    mysql> 

계산기로 사용하기:

    mysql> SELECT SIN(PI()/4), (4+1)*5;  
    +-------------+---------+  
    | SIN(PI()/4) | (4+1)*5 |  
    +-------------+---------+  
    |    0.707107 |      25 |  
    +-------------+---------+

여러 명령 한줄에 입력하기:

    mysql> SELECT VERSION(); SELECT NOW();  
    +--------------+  
    | version()    |  
    +--------------+  
    | 3.22.20a-log |  
    +--------------+
    +---------------------+  
    | NOW()               |  
    +---------------------+  
    | 1999-03-19 00:15:33 |  
    +---------------------+

여려줄에 한 명령 입력하기:

    mysql> SELECT  
        -> USER()  
        -> ,  
        -> CURRENT_DATE;  
    +--------------------+--------------+  
    | USER()             | CURRENT_DATE |  
    +--------------------+--------------+  
    | joesmith@localhost | 1999-03-18   |  
    +--------------------+--------------+

 

데이터베이스 만들고 선택하기

데이터베이스 보기 :

    SHOW DATABASES; 
    +----------+  
    | Database |  
    +----------+  
    | mysql    |  
    | python   |  
    | test     |  
    +----------+

사용할 데이터베이스 선택하기 :

    USE test

관리자로 하여금 지정된 사용자만 DB를 접근하도록 하기 :

      GRANT ALL ON dbname.* TO your_mysql_name;

새로운 데이터베이스 만들기:

    CREATE DATABASE menagerie;

관리자가 해주던지 아니면 본인이 해야한다(허가권이 있다면).

사용할 데이터베이스 선택 :

    USE menagerie

mysql을 호출할 때 db선택하기 :

    mysql -h host -u user -p menagerie

데이터베이스 없애기: (한번에 모든 것을 날려 버리므로 조심해서 사용할 것)

    DROP DATABASE database_name

 

테이블 만들기 / 없애기

테이블 보기 :

    SHOW TABLES; 
     Empty set (0.00 sec)  

테이블 만들기 :

    CREATE TABLE pet ( 
        -> name VARCHAR(20),  
        -> owner VARCHAR(20), 
        -> species VARCHAR(20),  
        -> sex CHAR(1),  
        -> birth DATE,  
        -> death DATE);

테이블 다시 보기:

    mysql> SHOW TABLES; 
    +---------------------+ 
    | Tables in menagerie | 
    +---------------------+ 
    | pet                 | 
    +---------------------+ 

테이블 확인하기:

    mysql> DESCRIBE pet; 
    +---------+-------------+------+-----+---------+-------+ 
    | Field   | Type        | Null | Key | Default | Extra | 
    +---------+-------------+------+-----+---------+-------+ 
    | name    | varchar(20) | YES  |     | NULL    |       | 
    | owner   | varchar(20) | YES  |     | NULL    |       | 
    | species | varchar(20) | YES  |     | NULL    |       | 
    | sex     | char(1)     | YES  |     | NULL    |       | 
    | birth   | date        | YES  |     | NULL    |       | 
    | death   | date        | YES  |     | NULL    |       | 
    +---------+-------------+------+-----+---------+-------+

테이블 없애기:

    mysql> DROP table table_name;

 

데이터를 테이블에 저장하기

 

테이블에 입력할 정보가 다음과 같다고 하자:

name

owner

species

sex

birth

death

Fluffy

Harold

cat

f

1993-02-04

Claws

Gwen

cat

m

1994-03-17

 

Buffy

Harold

dog

f

1989-05-13

 

Fang

Benny

dog

m

1990-08-27

 

Bowser

Diane

dog

m

1998-08-31

1995-07-29

Chirpy

Gwen

bird

f

1998-09-11

 

Whistler

Gwen

bird

1997-12-09

Slim

Benny

snake

m

1996-04-29

 

 

텍스트 파일에 정보가 있다면 쉽게 일괄적으로 테이블에 입력할 수 있다. 각 레코드는 한 라인에 입력되며, 각 필드는 탭으로 구분되어야 하고, NULL인 필드는 \N이 입력되어야 한다. 예:  

Whistler

Gwen

bird

\N

1997-12-09

\N

 

이와 같은 정보가 'pet.txt' 파일에 저장되어 있다고 한다면, 다음의 명령으로 일괄적으로 읽어들일 수 있다.

    mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;

한번에 한 레코드씩 입력하려면 다음과 같은 코맨드라인 명령을 쓴다.

    mysql> INSERT INTO pet  
        -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);

이 경우 값이 없으면 NULL을 사용한다. (\N는 아님)

 

테이블에서 데이터 검색하기

SELECT 문을 이용한다:

    SELECT what_to_select  
    FROM which_table  
    WHERE conditions_to_satisfy

전체 데이터 선택하기

    mysql> SELECT * FROM pet; 
    +----------+--------+---------+------+------------+------------+ 
    | name     | owner  | species | sex  | birth      | death      | 
    +----------+--------+---------+------+------------+------------+ 
    | Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       | 
    | Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       | 
    | Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       | 
    | Fang     | Benny  | dog     | m    | 1990-08-27 | NULL       | 
    | Bowser   | Diane  | dog     | m    | 1998-08-31 | 1995-07-29 | 
    | Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       | 
    | Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       | 
    | Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       | 
    | Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       | 
    +----------+--------+---------+------+------------+------------+

정보 갱신하기: Bowser의 생일을 1998년에서 1989로 수정하려면,

    mysql> UPDATE pet SET birth = "1989-08-31" WHERE name = "Bowser";

행 선택하여 출력하기:

    mysql> SELECT * FROM pet WHERE name = "Bowser"; 
    +--------+-------+---------+------+------------+------------+ 
    | name   | owner | species | sex  | birth      | death      | 
    +--------+-------+---------+------+------------+------------+ 
    | Bowser | Diane | dog     | m    | 1989-08-31 | 1995-07-29 | 
    +--------+-------+---------+------+------------+------------+
     
    mysql> SELECT * FROM pet WHERE birth >= "1998-1-1"; 
    +----------+-------+---------+------+------------+-------+ 
    | name     | owner | species | sex  | birth      | death | 
    +----------+-------+---------+------+------------+-------+ 
    | Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  | 
    | Puffball | Diane | hamster | f    | 1999-03-30 | NULL  | 
    +----------+-------+---------+------+------------+-------+
 
    mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f"; 
    +-------+--------+---------+------+------------+-------+ 
    | name  | owner  | species | sex  | birth      | death | 
    +-------+--------+---------+------+------------+-------+ 
    | Buffy | Harold | dog     | f    | 1989-05-13 | NULL  | 
    +-------+--------+---------+------+------------+-------+
     
    mysql> SELECT * FROM pet WHERE species = "snake" OR species = "bird"; 
    +----------+-------+---------+------+------------+-------+ 
    | name     | owner | species | sex  | birth      | death | 
    +----------+-------+---------+------+------------+-------+ 
    | Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  | 
    | Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL  | 
    | Slim     | Benny | snake   | m    | 1996-04-29 | NULL  | 
    +----------+-------+---------+------+------------+-------+
     
    mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m") 
               -> OR (species = "dog" AND sex = "f"); 
    +-------+--------+---------+------+------------+-------+ 
    | name  | owner  | species | sex  | birth      | death | 
    +-------+--------+---------+------+------------+-------+ 
    | Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  | 
    | Buffy | Harold | dog     | f    | 1989-05-13 | NULL  | 
    +-------+--------+---------+------+------------+-------+

열 선택하여 출력하기

    mysql> SELECT name, birth FROM pet; 
    +----------+------------+ 
    | name     | birth      | 
    +----------+------------+ 
    | Fluffy   | 1993-02-04 | 
    | Claws    | 1994-03-17 | 
    | Buffy    | 1989-05-13 | 
    | Fang     | 1990-08-27 | 
    | Bowser   | 1989-08-31 | 
    | Chirpy   | 1998-09-11 | 
    | Whistler | 1997-12-09 | 
    | Slim     | 1996-04-29 | 
    | Puffball | 1999-03-30 | 
    +----------+------------+
     
    mysql> SELECT owner FROM pet; 
    +--------+ 
    | owner  | 
    +--------+ 
    | Harold | 
    | Gwen   | 
    | Harold | 
    | Benny  | 
    | Diane  | 
    | Gwen   | 
    | Gwen   | 
    | Benny  | 
    | Diane  | 
    +--------+
     
    mysql> SELECT DISTINCT owner FROM pet; 
    +--------+ 
    | owner  | 
    +--------+ 
    | Benny  | 
    | Diane  | 
    | Gwen   | 
    | Harold | 
    +--------+
     
    mysql> SELECT name, species, birth FROM pet 
        -> WHERE species = "dog" OR species = "cat"; 
    +--------+---------+------------+ 
    | name   | species | birth      | 
    +--------+---------+------------+ 
    | Fluffy | cat     | 1993-02-04 | 
    | Claws  | cat     | 1994-03-17 | 
    | Buffy  | dog     | 1989-05-13 | 
    | Fang   | dog     | 1990-08-27 | 
    | Bowser | dog     | 1989-08-31 | 
    +--------+---------+------------+

정렬하기

    mysql> SELECT name, birth FROM pet ORDER BY birth; 
    +----------+------------+ 
    | name     | birth      | 
    +----------+------------+ 
    | Buffy    | 1989-05-13 | 
    | Bowser   | 1989-08-31 | 
    | Fang     | 1990-08-27 | 
    | Fluffy   | 1993-02-04 | 
    | Claws    | 1994-03-17 | 
    | Slim     | 1996-04-29 | 
    | Whistler | 1997-12-09 | 
    | Chirpy   | 1998-09-11 | 
    | Puffball | 1999-03-30 | 
    +----------+------------+
     
    mysql> SELECT name, birth FROM pet ORDER BY birth DESC; 
    +----------+------------+ 
    | name     | birth      | 
    +----------+------------+ 
    | Puffball | 1999-03-30 | 
    | Chirpy   | 1998-09-11 | 
    | Whistler | 1997-12-09 | 
    | Slim     | 1996-04-29 | 
    | Claws    | 1994-03-17 | 
    | Fluffy   | 1993-02-04 | 
    | Fang     | 1990-08-27 | 
    | Bowser   | 1989-08-31 | 
    | Buffy    | 1989-05-13 | 
    +----------+------------+
     
    mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC; 
    +----------+---------+------------+ 
    | name     | species | birth      | 
    +----------+---------+------------+ 
    | Chirpy   | bird    | 1998-09-11 | 
    | Whistler | bird    | 1997-12-09 | 
    | Claws    | cat     | 1994-03-17 | 
    | Fluffy   | cat     | 1993-02-04 | 
    | Fang     | dog     | 1990-08-27 | 
    | Bowser   | dog     | 1989-08-31 | 
    | Buffy    | dog     | 1989-05-13 | 
    | Puffball | hamster | 1999-03-30 | 
    | Slim     | snake   | 1996-04-29 | 
    +----------+---------+------------+

날짜계산하기

    mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 FROM pet; 
    +----------+-------------------------------------+ 
    | name     | (TO_DAYS(NOW())-TO_DAYS(birth))/365 | 
    +----------+-------------------------------------+ 
    | Fluffy   |                                6.15 | 
    | Claws    |                                5.04 | 
    | Buffy    |                                9.88 | 
    | Fang     |                                8.59 | 
    | Bowser   |                                9.58 | 
    | Chirpy   |                                0.55 | 
    | Whistler |                                1.30 | 
    | Slim     |                                2.92 | 
    | Puffball |                                0.00 | 
    +----------+-------------------------------------+
     
    mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age 
        -> FROM pet ORDER BY name; 
    +----------+------+ 
    | name     | age  | 
    +----------+------+ 
    | Bowser   | 9.58 | 
    | Buffy    | 9.88 | 
    | Chirpy   | 0.55 | 
    | Claws    | 5.04 | 
    | Fang     | 8.59 | 
    | Fluffy   | 6.15 | 
    | Puffball | 0.00 | 
    | Slim     | 2.92 | 
    | Whistler | 1.30 | 
    +----------+------+
     
    mysql>  SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age 
        ->  FROM pet ORDER BY age; 
    +----------+------+ 
    | name     | age  | 
    +----------+------+ 
    | Puffball | 0.00 | 
    | Chirpy   | 0.55 | 
    | Whistler | 1.30 | 
    | Slim     | 2.92 | 
    | Claws    | 5.04 | 
    | Fluffy   | 6.15 | 
    | Fang     | 8.59 | 
    | Bowser   | 9.58 | 
    | Buffy    | 9.88 | 
    +----------+------+
     
    mysql>  SELECT name, birth, death, (TO_DAYS(death)-TO_DAYS(birth))/365 AS age 
        ->  FROM pet WHERE death IS NOT NULL ORDER BY age; 
    +--------+------------+------------+------+ 
    | name   | birth      | death      | age  | 
    +--------+------------+------------+------+ 
    | Bowser | 1989-08-31 | 1995-07-29 | 5.91 | 
    +--------+------------+------------+------+

DATE에서 해, 달, 일의 정보를 꺼내려면, YEAR(), MONTH(), DAYOFMONTH()를 이용한다.

    mysql> SELECT name, birth, MONTH(birth) FROM pet; 
    +----------+------------+--------------+ 
    | name     | birth      | MONTH(birth) | 
    +----------+------------+--------------+ 
    | Fluffy   | 1993-02-04 |            2 | 
    | Claws    | 1994-03-17 |            3 | 
    | Buffy    | 1989-05-13 |            5 | 
    | Fang     | 1990-08-27 |            8 | 
    | Bowser   | 1989-08-31 |            8 | 
    | Chirpy   | 1998-09-11 |            9 | 
    | Whistler | 1997-12-09 |           12 | 
    | Slim     | 1996-04-29 |            4 | 
    | Puffball | 1999-03-30 |            3 | 
    +----------+------------+--------------+

5월에 태어난 동물을 출력하려면:

    mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5; 
    +-------+------------+ 
    | name  | birth      | 
    +-------+------------+ 
    | Buffy | 1989-05-13 | 
    +-------+------------+

패턴 매칭

'%'는 (0을 포함한) 임의의 수의 문자와 매칭한다. 'b'로 시작하는 이름의 동물을 찾으려면,

    mysql> SELECT * FROM pet WHERE name LIKE "b%"; 
    +--------+--------+---------+------+------------+------------+ 
    | name   | owner  | species | sex  | birth      | death      | 
    +--------+--------+---------+------+------------+------------+ 
    | Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       | 
    | Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 | 
    +--------+--------+---------+------+------------+------------+

'fy'로 끝나는 이름의 동물은,

    mysql> SELECT * FROM pet WHERE name LIKE "%fy"; 
    +--------+--------+---------+------+------------+-------+ 
    | name   | owner  | species | sex  | birth      | death | 
    +--------+--------+---------+------+------------+-------+ 
    | Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  | 
    | Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  | 
    +--------+--------+---------+------+------------+-------+

'w'가 있는 이름의 동물은,

    mysql> SELECT * FROM pet WHERE name LIKE "%w%"; 
    +----------+-------+---------+------+------------+------------+ 
    | name     | owner | species | sex  | birth      | death      | 
    +----------+-------+---------+------+------------+------------+ 
    | Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       | 
    | Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 | 
    | Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       | 
    +----------+-------+---------+------+------------+------------+

꼭 다섯자로 구성된 이름의 동물은,

    mysql> SELECT * FROM pet WHERE name LIKE "_____"; 
    +-------+--------+---------+------+------------+-------+ 
    | name  | owner  | species | sex  | birth      | death | 
    +-------+--------+---------+------+------------+-------+ 
    | Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  | 
    | Buffy | Harold | dog     | f    | 1989-05-13 | NULL  | 
    +-------+--------+---------+------+------------+-------+

확장된 정규식

  • '.'는 임의의 한자와 매치
  • '[abc] 는 'a' 또는 'b' 또는 'c'
  • '*'는 0이상의 임의의 수의 앞선 문자와 매치 'x*'는 임의의 수의 'x'와 매치. [0-9]*는 임의의 수의 숫자와, '.*' 는 임의의 문자와 매치
  • 대소문자를 구별함 (case sensitive)
  • 테스트되는 임의의 어떤 부분에서 매치되면 됨 (SQL패턴 매치는 전체가 다 매치되어야함)
  • 시작과 끝을 매치하기 위하여 '^' '$'를 사용한다.

'b'혹은 'B'로 시작하는 이름:

    mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]"; 
    +--------+--------+---------+------+------------+------------+ 
    | name   | owner  | species | sex  | birth      | death      | 
    +--------+--------+---------+------+------------+------------+ 
    | Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       | 
    | Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 | 
    +--------+--------+---------+------+------------+------------+

마지막에 `fy' 로 끝나는 이름:

    mysql> SELECT * FROM pet WHERE name REGEXP "fy$"; 
    +--------+--------+---------+------+------------+-------+ 
    | name   | owner  | species | sex  | birth      | death | 
    +--------+--------+---------+------+------------+-------+ 
    | Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  | 
    | Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  | 
    +--------+--------+---------+------+------------+-------+

`w'를 포함하는 이름:

    mysql> SELECT * FROM pet WHERE name REGEXP "[wW]"; 
    +----------+-------+---------+------+------------+------------+ 
    | name     | owner | species | sex  | birth      | death      | 
    +----------+-------+---------+------+------------+------------+ 
    | Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       | 
    | Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 | 
    | Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       | 
    +----------+-------+---------+------+------------+------------+

다섯 문자로 이루어진 이름:

    mysql> SELECT * FROM pet WHERE name REGEXP "^.....$"; 
    +-------+--------+---------+------+------------+-------+ 
    | name  | owner  | species | sex  | birth      | death | 
    +-------+--------+---------+------+------------+-------+ 
    | Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  | 
    | Buffy | Harold | dog     | f    | 1989-05-13 | NULL  | 
    +-------+--------+---------+------+------------+-------+

`{n}' 연산자 (repeat-n-times)를 사용하여 아래와 같이 쓸 수도 있음:

    mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$"; 
    +-------+--------+---------+------+------------+-------+ 
    | name  | owner  | species | sex  | birth      | death | 
    +-------+--------+---------+------+------------+-------+ 
    | Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  | 
    | Buffy | Harold | dog     | f    | 1989-05-13 | NULL  | 
    +-------+--------+---------+------+------------+-------+

행의 수 세기

전체 엔트리 수 세기:

    mysql> SELECT COUNT(*) FROM pet; 
    +----------+ 
    | COUNT(*) | 
    +----------+ 
    |        9 | 
    +----------+

주인이 가지고 있는 동물의 수 세기:

    mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; 
    +--------+----------+ 
    | owner  | COUNT(*) | 
    +--------+----------+ 
    | Benny  |        2 | 
    | Diane  |        2 | 
    | Gwen   |        3 | 
    | Harold |        2 | 
    +--------+----------+

종별 수:

    mysql> SELECT species, COUNT(*) FROM pet GROUP BY species; 
    +---------+----------+ 
    | species | COUNT(*) | 
    +---------+----------+ 
    | bird    |        2 | 
    | cat     |        2 | 
    | dog     |        3 | 
    | hamster |        1 | 
    | snake   |        1 | 
    +---------+----------+

성별 수:

    mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex; 
    +------+----------+ 
    | sex  | COUNT(*) | 
    +------+----------+ 
    | NULL |        1 | 
    | f    |        4 | 
    | m    |        4 | 
    +------+----------+

종 및 성별 수:

    mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex; 
    +---------+------+----------+ 
    | species | sex  | COUNT(*) | 
    +---------+------+----------+ 
    | bird    | NULL |        1 | 
    | bird    | f    |        1 | 
    | cat     | f    |        1 | 
    | cat     | m    |        1 | 
    | dog     | f    |        1 | 
    | dog     | m    |        2 | 
    | hamster | f    |        1 | 
    | snake   | m    |        1 | 
    +---------+------+----------+

개와 고양이에 대해서만 적용:

    mysql> SELECT species, sex, COUNT(*) FROM pet 
        -> WHERE species = "dog" OR species = "cat" 
        -> GROUP BY species, sex; 
    +---------+------+----------+ 
    | species | sex  | COUNT(*) | 
    +---------+------+----------+ 
    | cat     | f    |        1 | 
    | cat     | m    |        1 | 
    | dog     | f    |        1 | 
    | dog     | m    |        2 | 
    +---------+------+----------+

알려진 성별에 대해서만 성별 동물의 수:

    mysql> SELECT species, sex, COUNT(*) FROM pet 
        -> WHERE sex IS NOT NULL 
        -> GROUP BY species, sex; 
    +---------+------+----------+ 
    | species | sex  | COUNT(*) | 
    +---------+------+----------+ 
    | bird    | f    |        1 | 
    | cat     | f    |        1 | 
    | cat     | m    |        1 | 
    | dog     | f    |        1 | 
    | dog     | m    |        2 | 
    | hamster | f    |        1 | 
    | snake   | m    |        1 | 
    +---------+------+----------+

 

하나이상의 테이블 사용하기

테이블 하나 더 만들기:

    mysql> CREATE TABLE event  ( 
        -> name VARCHAR(20),  
        -> date DATE, 
        -> type VARCHAR(15),  
        -> remark VARCHAR(255));

파일 'event.txt'

Fluffy

1995-05-15

litter

4 kittens, 3 female, 1 male

Buffy

1993-06-23

litter

5 puppies, 2 female, 3 male

Buffy

1994-06-19

litter

3 puppies, 3 female

Chirpy

1999-03-21

vet

needed beak straightened

Slim

1997-08-03

vet

broken rib

Bowser

1991-10-12

kennel

 

Fang

1991-10-12

kennel

 

Fang

1998-08-28

birthday

Gave him a new chew toy

Claws

1998-03-17

birthday

Gave him a new flea collar

Whistler

1998-12-09

birthday

First birthday

 

데이터 읽어들이기:

    mysql> LOAD DATA LOCAL INFILE "event.txt" INTO TABLE event;

출산 때의 동물의 나이를 계산 (JOIN):

    mysql> SELECT pet.name, (TO_DAYS(date) - TO_DAYS(birth))/365 AS age, remark 
        -> FROM pet, event 
        -> WHERE pet.name = event.name AND type = "litter"; 
    +--------+------+-----------------------------+ 
    | name   | age  | remark                      | 
    +--------+------+-----------------------------+ 
    | Fluffy | 2.27 | 4 kittens, 3 female, 1 male | 
    | Buffy  | 4.12 | 5 puppies, 2 female, 3 male | 
    | Buffy  | 5.10 | 3 puppies, 3 female         | 
    +--------+------+-----------------------------+

짝찾아보기 (JOINing itself):

    mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species 
        -> FROM pet AS p1, pet AS p2 
        -> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m"; 
    +--------+------+--------+------+---------+ 
    | name   | sex  | name   | sex  | species | 
    +--------+------+--------+------+---------+ 
    | Fluffy | f    | Claws  | m    | cat     | 
    | Buffy  | f    | Fang   | m    | dog     | 
    | Buffy  | f    | Bowser | m    | dog     | 
    +--------+------+--------+------+---------+

 

기타의 연산

 

    CREATE TABLE shop ( 
     article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL, 
     dealer  CHAR(20)                 DEFAULT ''     NOT NULL, 
     price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL, 
     PRIMARY KEY(article, dealer));
 
    INSERT INTO shop VALUES 
    (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69), 
    (3,'D',1.25),(4,'D',19.95);

전체 데이터 예는:

    SELECT * FROM shop 
    +---------+--------+-------+ 
    | article | dealer | price | 
    +---------+--------+-------+ 
    |    0001 | A      |  3.45 | 
    |    0001 | B      |  3.99 | 
    |    0002 | A      | 10.99 | 
    |    0003 | B      |  1.45 | 
    |    0003 | C      |  1.69 | 
    |    0003 | D      |  1.25 | 
    |    0004 | D      | 19.95 | 
    +---------+--------+-------+

최대 아이템 수는?

    SELECT MAX(article) AS article FROM shop 
    +---------+ 
    | article | 
    +---------+ 
    |       4 | 
    +---------+

가장 비싼 항목의 번호, 판매자, 가격?

    SELECT article, dealer, price 
    FROM   shop 
    WHERE  price=(SELECT MAX(price) FROM shop)

각 항목의 최고 가격은?

    SELECT article, MAX(price) AS price 
    FROM   shop 
    GROUP BY article
    +---------+-------+ 
    | article | price | 
    +---------+-------+ 
    |    0001 |  3.99 | 
    |    0002 | 10.99 | 
    |    0003 |  1.69 | 
    |    0004 | 19.95 | 
    +---------+-------+

각 항목에 대하여 가장 비싼 가격의 딜러를 찾아라!

    SELECT article, dealer, price 
    FROM   shop s1 
    WHERE  price=(SELECT MAX(s2.price) 
                  FROM shop s2 
                  WHERE s1.article = s2.article)

항목 삭제하기 (DELETE)

문법 : DELETE FROM tbl_name [WHERE where_condition] [LIMIT rows]

 

외부키(Foreign Key)사용하기

     
    CREATE TABLE persons ( 
        id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,  
        name CHAR(60) NOT NULL, 
        PRIMARY KEY (id) 
    );
     
    CREATE TABLE shirts ( 
        id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 
        style ENUM('t-shirt', 'polo', 'dress') NOT NULL, 
        color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL, 
        owner SMALLINT UNSIGNED NOT NULL REFERENCES persons, 
        PRIMARY KEY (id) 
    );
     
    INSERT INTO persons VALUES (NULL, 'Antonio Paz');
     
    INSERT INTO shirts VALUES 
    (NULL, 'polo', 'blue', LAST_INSERT_ID()), 
    (NULL, 'dress', 'white', LAST_INSERT_ID()), 
    (NULL, 't-shirt', 'blue', LAST_INSERT_ID());
     
    INSERT INTO persons VALUES (NULL, 'Lilliana Angelovska');
     
    INSERT INTO shirts VALUES 
    (NULL, 'dress', 'orange', LAST_INSERT_ID()), 
    (NULL, 'polo', 'red', LAST_INSERT_ID()), 
    (NULL, 'dress', 'blue', LAST_INSERT_ID()), 
    (NULL, 't-shirt', 'white', LAST_INSERT_ID());
     
    SELECT * FROM persons; 
    +----+---------------------+ 
    | id | name                | 
    +----+---------------------+ 
    |  1 | Antonio Paz         | 
    |  2 | Lilliana Angelovska | 
    +----+---------------------+
     
    SELECT * FROM shirts; 
    +----+---------+--------+-------+ 
    | id | style   | color  | owner | 
    +----+---------+--------+-------+ 
    |  1 | polo    | blue   |     1 | 
    |  2 | dress   | white  |     1 | 
    |  3 | t-shirt | blue   |     1 | 
    |  4 | dress   | orange |     2 | 
    |  5 | polo    | red    |     2 | 
    |  6 | dress   | blue   |     2 | 
    |  7 | t-shirt | white  |     2 | 
    +----+---------+--------+-------+
     
    SELECT s.* FROM persons p, shirts s 
     WHERE p.name LIKE 'Lilliana%' 
       AND s.owner = p.id 
       AND s.color &lt;&gt; 'white';
    +----+-------+--------+-------+ 
    | id | style | color  | owner | 
    +----+-------+--------+-------+ 
    |  4 | dress | orange |     2 | 
    |  5 | polo  | red    |     2 | 
    |  6 | dress | blue   |     2 | 
    +----+-------+--------+-------+

 

테이블 구조 바꾸기

테이블 이름 바꾸기

    t1에서 t2로 이름 바꾸기
     
    mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
    mysql> ALTER TABLE t1 RENAME t2;

컬럼의 형 바꾸기

    테이블 t2의 컬럼 a를 INTEGER에서 TINYINT NOT NULL 형으로 전환하기
     
    mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL;

컬럼의 길이 바꾸기

    테이블 t2의 컬럼 b CHAR(10)을 c CHAR(20)으로 길이와 이름 바꾸기
     
    mysql> ALTER TABLE t2 CHANGE b c CHAR(20);

새 컬럼 추가하기

    timestamp란 컬럼을 t2에 추가하기
     
    mysql> ALTER TABLE t2 ADD d TIMESTAMP;

인덱스 컬럼 만들기 / primary key 설정하기

    t2에 컬럼 d의 인덱스를 추가하기, 컬럼 a를 주 키로 설정한다.
     
    mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);

컬럼 없애기

    테이블 t2에서 컬럼 c를 없앤다.
     
    mysql> ALTER TABLE t2 DROP COLUMN c;

새 컬럼 추가하기

    테이블 t2에 INT UNSIGNED NOT NULL AUTO_INCREMENT 형 컬럼 c를 새로 만들기
     
    mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT;

테이블 없애기

    mysql> DROP TABLE table_name

 


언어 참조

스트링

    'a string' "another string"

Escape sequences

    \0   An ASCII 0 (NUL) character.   
    \n   A newline character.   
    \t   A tab character.   
    \r   A carriage return character.   
    \b   A backspace character.   
    \'   A single quote (`'') character.   
    \"   A double quote (`"') character.   
    \\   A backslash (`\') character.   
    \%   A `%' character. This is used to search for literal instances of `%' in contexts  
           where `%' would otherwise be interpreted as a wildcard character.   
    \_   A `_' character. This is used to search for literal instances of `_' in contexts  
           where `_' would otherwise be interpreted as a wildcard character. 
    mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello'; 
    +-------+---------+-----------+--------+--------+ 
    | hello | "hello" | ""hello"" | hel'lo | 'hello | 
    +-------+---------+-----------+--------+--------+
     
    mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello"; 
    +-------+---------+-----------+--------+--------+ 
    | hello | 'hello' | ''hello'' | hel"lo | "hello | 
    +-------+---------+-----------+--------+--------+
     
    mysql> SELECT "This\nIs\nFour\nlines"; 
    +--------------------+ 
    | This 
    Is 
    Four 
    lines | 
    +--------------------+

숫자

정수형 (1221, 0, -32), 부동소숫점형 (3.4, -23.45e+10, 148.00), 16진수(0x23fc)

Column Types

Numeric types

Column type

Storage required

TINYINT

1 byte

SMALLINT

2 bytes

MEDIUMINT

3 bytes

INT

4 bytes

INTEGER

4 bytes

BIGINT

8 bytes

FLOAT(X)

4 if X <= 24 or 8 if 25 <= X <= 53

FLOAT

4 bytes

DOUBLE

8 bytes

DOUBLE PRECISION

8 bytes

REAL

8 bytes

DECIMAL(M,D)

M bytes (D+2, if M < D)

NUMERIC(M,D)

M bytes (D+2, if M < D)

 

Date and time types

Column type

Storage required

DATE

3 bytes

DATETIME

8 bytes

TIMESTAMP

4 bytes

TIME

3 bytes

YEAR

1 byte

 

date, time이 값의 범위를 벋어날 경우는 zero value를 갖는다.

Column type

``Zero'' value

DATETIME

'0000-00-00 00:00:00'

DATE

'0000-00-00'

TIMESTAMP

00000000000000 (length depends on display size)

TIME

'00:00:00'

YEAR

0000

 

Timestamp format

Column type

Display format

TIMESTAMP(14)

YYYYMMDDHHMMSS

TIMESTAMP(12)

YYMMDDHHMMSS

TIMESTAMP(10)

YYMMDDHHMM

TIMESTAMP(8)

YYYYMMDD

TIMESTAMP(6)

YYMMDD

TIMESTAMP(4)

YYMM

TIMESTAMP(2)

YY

 

String types

Column type

Storage required

CHAR(M)

M bytes, 1 <= M <= 255

VARCHAR(M)

L+1 bytes, where L <= M and 1 <= M <= 255

TINYBLOBTINYTEXT

L+1 bytes, where L < 2^8

BLOBTEXT

L+2 bytes, where L < 2^16

MEDIUMBLOBMEDIUMTEXT

L+3 bytes, where L < 2^24

LONGBLOBLONGTEXT

L+4 bytes, where L < 2^32

ENUM('value1','value2',...)

1 or 2 bytes, depending on the number of enumeration values (65535 values maximum)

SET('value1','value2',...)

1, 2, 3, 4 or 8 bytes, depending on the number of set members (64 members maximum)

 

기억 용량 비교

Value

CHAR(4)

Storage required

VARCHAR(4)

Storage required

''

' '

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

 

* BLOB 는 case-sensitive, TEXT는 case-insensitive

인덱스

적절한 인덱스의 사용은 SELECT문의 성능을 크게 향상시켜준다. 최대 16개까지의 인덱스를 갖는다. 최대 인덱스 길이는 256바이트이다. CHAR과 VARCHAR에 대해서 앞 문자열을 대상으로 인덱스 할 수 있다. BLOB와 TEXT에 대해서 앞문자열을 사용하는 것은 인덱스 할 때 필수이다.

    mysql> CREATE TABLE test ( 
               name CHAR(200) NOT NULL, 
               KEY index_name (name(10)));

복수개 컬럼에 대해서 인덱스를 만들 수 있다. 최대 15개 컬럼을 사용할 수 있다.

     
    mysql> CREATE TABLE test ( 
               id INT NOT NULL, 
               last_name CHAR(30) NOT NULL, 
               first_name CHAR(30) NOT NULL, 
               PRIMARY KEY (id), 
               INDEX name (last_name,first_name));

name인덱스의 사용예:

     
    mysql> SELECT * FROM test WHERE last_name="Widenius";
     
    mysql> SELECT * FROM test WHERE last_name="Widenius" 
                              AND first_name="Michael";
     
    mysql> SELECT * FROM test WHERE last_name="Widenius" 
                              AND (first_name="Michael" OR first_name="Monty");
     
    mysql> SELECT * FROM test WHERE last_name="Widenius" 
                              AND first_name >="M" AND first_name < "N";

연산자

다음의 연산자는 select문에서 사용가능하다.

산술 연산자

    +, -, *, /, MOD(a,b) : a를 b로 나눈 나머지

비트 연산자

    |, &, <<, >>, ~, BIT_COUNT(N) : N의 설정된 비트 수

논리 연산자

    !, ||, &&, 

비교 연산자

    =, >, <, >=, <=, <> (!=),   
    <=> (Null safe equal),   
    IS NULL, IS NOT NULL,   
    between a and b  
    expr IN (value, ...), expr NOT IN (value, ...)  
    ISNULL(expr), COALESCE(list), INTERVAL(N,N1,N2,N3,...)
     
     
    mysql> select 1 <=> 1, NULL <=> NULL, 1 <=> NULL; 
                      -> 1 1 0
     
    mysql> select 1 BETWEEN 2 AND 3; 
               -> 0
     
    mysql> select 'b' BETWEEN 'a' AND 'c'; 
               -> 1
     
    mysql> select 2 BETWEEN 2 AND '3'; 
               -> 1
     
    mysql> select 2 BETWEEN 2 AND 'x-3'; 
               -> 0
     
    mysql> select 2 IN (0,3,5,'wefwf'); 
               -> 0
     
    mysql> select 'wefwf' IN (0,3,5,'wefwf'); 
               -> 1
    .......
728x90
반응형
728x90
반응형
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

ANT_HOME=/usr/local/apache-ant-1.7.1
JAVA_HOME=/usr/local/java
APACHE2=/usr/local/apache2
CATALINA_HOME=/usr/local/tomcat

PATH=$ANT_HOME/bin:$JAVA_HOME/bin:$APACHE2/bin:$CATALINA_HOME/bin:$PATH:$HOME/bin:/sbin:/usr/sbin
CLASSPATH=$CATALINA_HOME/bin/bootstrap.jar:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/common/lib/servlet.jar:$ANT_HOME/lib/ant-nodeps.jar:.


#export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC ANT_HOME JAVA_HOME CATALINA_HOME CLASSPATH


unset USERNAME

728x90
반응형
728x90
반응형
#!/bin/sh
TOMCAT_BASE="apache-tomcat-6.0.18"

/sbin/service tomcat5 stop
chkconfig --del tomcat5


tar xvfz $TOMCAT_BASE.tar.gz
mv $TOMCAT_BASE /usr/local/
cd /usr/local
ln -s $TOMCAT_BASE tomcat

cd /usr/local/tomcat/webapps
rm -rf ./*

728x90
반응형
728x90
반응형
#!/bin/sh

ANT_BASE="apache-ant-1.7.1"

tar xvfj $ANT_BASE-bin.tar.bz2

mv $ANT_BASE /usr/local
cd /usr/local
#remove older link
rm -f /usr/local/ant
#create symbolic link
ln -s apache-ant-1.7.1 ant
#other compilations need to be able to find ant easily, so add link below
ln -s /usr/local/ant/bin/ant /usr/local/bin/ant

728x90
반응형

+ Recent posts