[MYSQL]트리거를 이용한 날짜 자동 업데이트

많은 분들이 아시겠지만 모르시는 분들을 위해 팁에 올립니다.

초보가 아닌 분은 뒤로 버튼을 눌러주시면 되겠습니다 ^^;

mysql 5.x 대부터 많은 변화가 있었는데요 이 중 Trigger에 대해 올릴까 합니다.

Trigger란 특정 테이블에 입력, 수정, 삭제가 이루어 졌을 경우 특정 명령을 실행하는 기능인데요,

트리거를 이용하여 테이블에 데이타를 수정했을 경우 수정한 날짜를 자동으로 기록하는 예제를 실행해 보도록 하겠습니다.

트리거를 이용하지 않고도 DEFAULT CURRENT_TIMESTAMP UPDATE ON CURRENT_TIMESTAMP 를 사용하면 해결되겠으나,

이미 입력날짜를 DEFAULT CURRENT_TIMESTAMP로 했을 경우 두 칼럼의 날짜를 자동으로 입력이 불가능할때 사용하시면 되겠습니다.

[mysql]트리거를 이용한 날짜 자동 업데이트

준비사항 : mysql 5.0 이상

*/

트리거용 테스트 테이블을 만듭니다

DROP TABLE TriggerTest;

CREATE TABLE TriggerTest (

  pk INTEGER AUTO_INCREMENT PRIMARY KEY,

    col01 VARCHAR(12) NOT NULL,

    regDate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, — 입력시
자동으로 날짜를 기입하기 위해 timestamp 타입과 기본 입력값으로 current_timestamp를 사용했습니다

    modifyDate TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00’

)

트리거를 만듭니다.

— 기본 트리거 문법은 CREATE TRIGGER [트리거이름] [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON [테이블이름] FOR EACH ROW [실행문] 입니다



CREATE TRIGGER TRG_TriggerTest_UPDATE

BEFORE UPDATE ON TriggerTest

FOR EACH ROW

BEGIN

    SET NEW.modifyDate = CURRENT_TIMESTAMP;

END;

— 테스트용 데이타를 입력합니다.

INSERT INTO TriggerTest SET col01 = ‘123’;

INSERT INTO TriggerTest SET col01 = ‘456’;

SELECT * FROM TriggerTest;

— 대략 아래와 같이 실행되었으리라 예상합니다.

pk    col01    regDate                      modifyDate

——————————————————————————————————————

1    123    “2008-03-20 오전 11:33:44”    ‘0000-00-00 00:00:00’

2    456    “2008-03-20 오전 11:33:44”    ‘0000-00-00 00:00:00’

——————————————————————————————————————

–이제 PK가 2인 COL01 의 칼럼을 수정하겠습니다.

UPDATE TriggerTest SET col01 = ‘012’ where pk = 2;

— 결과를 보도록 하죠.

SELECT * FROM TriggerTest;

아래와 같이 수정한 칼럼의 수정일이 저장되었습니다.

pk    col01    regDate                      modifyDate

——————————————————————————————————————

1    123    “2008-03-20 오전 11:33:44”    ‘0000-00-00 00:00:00’

2    012    “2008-03-20 오전 11:33:44”    “2008-03-20 오전 11:36:34”

——————————————————————————————————————

트리거를 좀더 활용하면 특정 테이블에 데이타가 들어오면 자동으로 다른 테이블에 입력, 수정, 삭제도 가능합니다.

짜집기한 MYSQL 클래스

20여개의 mysql 관련 클래스중에서 필요한 것만 모아서 짜집기한 클래스…
일반적인 mysql 클래스에 리스트와 페이징까지 한번에 처리하는 함수와 xml로 결과를 출력하는
함수 추가.


클래스내용 >>


[code]
//DB클래스
class dbH {
    // PRIVATE 변수
    private    $CONN;                // DB 커넥트
    private    $ERR_QUERY;    // 에러가 발생한 쿼리
    private    $ERR_MSG;        // 에러 메세지
    private    $RESULT;            // 쿼리 결과
    private    $REC_COUNT;    // 레코드 합계
    private    $ROW;                // 레코드 결과 FETCH
    private    $ROWNUM;        // 현재 레코드 번호



    // 클래스 초기화
    function dbH() {
        $DB_HOST = “localhost”;
        $DB_USER = “new_chong”;
        $DB_PW = “new3432”;
        $DB_NAME = “new_chong”;


        $this->CONN = mysql_connect($DB_HOST, $DB_USER, $DB_PW) or die(“데이터베이트 연결 실패! 환경설정을 확인해주세요.”);
        mysql_select_db($DB_NAME, $this->CONN) or die(“데이터베이트 접근 실패! 환경설정을 확인해주세요.”);
    }


        function getMessage()
    {
        return $this->message;
    }


    //GET NUM ROWS
    function getNumRows()
    {
        return mysql_num_rows($this->result);
    }


    //GET AFFECTED ROWS
    function getAffectedRows()
    {
        return mysql_affected_rows($this->result);
    }



    // INSERT, UPDATE, DELETE 등의 쿼리문 실행. (결과 없음)
    function Open($query) {
        $this->ERR_MSG = “”;


        if (!mysql_query($query)) {
            $this->ERR_QUERY = $query;
            $this->ERR_MSG = mysql_error();
            return false;
        }
    }


    // SELECT 쿼리문 실행. (결과 있음)
    function Execute($query) {
        $this->ERR_MSG = “”;


        if (!$this->RESULT = mysql_query($query)) {
            $this->ERR_QUERY = $query;
            $this->ERR_MSG = mysql_error();
            return false;
        }
        else {
            $this->REC_COUNT = mysql_num_rows($this->RESULT);
            $this->ROW = mysql_fetch_assoc($this->RESULT);
            $this->ROWNUM = 0;
        }
    }


    // RecordCount
    function RecordCount() {
        return $this->REC_COUNT;
    }


        //insert_ID
        function InsertID() {
                if($this->result=mysql_insert_id($this->CONN)){
                        return($this->result);
                } else {
                    return $this->errorMessage(“Cannot retrieve auto_increment value: $this->CONN”);
                }
        }



    // 레코드 처음
    function MoveFirst() {
        mysql_data_seek($this->RESULT, 0);
        $this->ROW = mysql_fetch_assoc($this->RESULT);
    }


    // 레코드 마지막
    function MoveLast() {
        mysql_data_seek($this->RESULT, $this->REC_COUNT – 1);
        $this->ROW = mysql_fetch_assoc($this->RESULT);
    }


    // 다음 레코드
    function MoveNext() {
        $this->ROWNUM = $this->ROWNUM + 1;


        if ($this->ROWNUM < $this->REC_COUNT) {
            mysql_data_seek($this->RESULT, $this->ROWNUM);
            $this->ROW = mysql_fetch_assoc($this->RESULT);
            return true;
        }
        else { return false; }
    }


    // 이전 레코드
    function MovePrev() {
        $this->ROWNUM = $this->ROWNUM – 1;


        if ($this->ROWNUM >= 0) {
            mysql_data_seek($this->RESULT, $this->ROWNUM);
            $this->ROW = mysql_fetch_assoc($this->RESULT);
            return true;
        }
        else { return false; }
    }


    // 필드값 가져오기
    function Field($field_name) {
        return $this->ROW[$field_name];
    }


    // 데이터베이스 접속 종료
    function Close() {
        mysql_close($this->CONN);
    }


    // 가장 최근 에러메세지 표시
    function ShowError() {
        if (strlen($this->ERR_MSG) > 0) {
            $msg = “<big><b>오류 내역입니다</b></big><br>”;
            $msg .= “<table width=’100%’ border=’0′ cellpadding=’4′ cellspacing=’1′ bgcolor=’#BCBCBC’>”;
            $msg .= “<tr>”;
            $msg .= “<td bgcolor=’#EFEFEF’><span style=’font-size : 9pt;’><b>실행된 쿼리문</b></span></td>”;
            $msg .= “<td bgcolor=’#FFFFFF’><span style=’font-size : 9pt; color : #666666;’>”.$this->ERR_QUERY.”</span></td>”;
            $msg .= “</tr>”;
            $msg .= “<tr>”;
            $msg .= “<td bgcolor=’#EFEFEF’><span style=’font-size : 9pt;’><b>에러 메세지</b></span></td>”;
            $msg .= “<td bgcolor=’#FFFFFF’><span style=’font-size : 9pt; color : #666666;’>”.$this->ERR_MSG.”</span></td>”;
            $msg .= “</tr>”;
            $msg .= “</table>”;
            $msg .= “<br><br>”;
            $msg .= “<div align=’center’><input type=’button’ value='<< MOVE BACK’ onClick=’history.go(-1)’ style=’border : solid 1 #000000; background-color : #5D5D5D; color : #FFFFFF;’>”;


            echo $msg;
        }
    }
        /********************************************
     DO QUERY METHOD:결과 아이디 받아옴
     *******************************************/
    function doQuery($query)
    {
        $this->query=$query;
        $this->result=mysql_query($this->query,$this->CONN) or die(mysql_error() );
        return $this->result;
    }


    /********************************************
     DO LIST:리스트 출력
     *******************************************/
    function doList($recordPerPage,$currentPage)
    {
        if($this->i==0)
        {
            $firstRecord=$recordPerPage*($currentPage-1);
            $this->query=$this->query.’ LIMIT ‘.$firstRecord.’,’.$recordPerPage;
            $this->result=$this->doQuery($this->query);
        }
        if(!$row=mysql_fetch_array($this->result) )
        {
            $this->query=explode(‘LIMIT’,$this->query);
            $this->query=$this->query[0];
            $this->result=$this->doQuery($this->query);
            $this->i=0;
            return false;
        }


        //RETURN ROWS
        $this->i++;
        return $row;
    }


    /********************************************
     GET PAGE INDEX:페이지 인텍스 HTML코드 반환
     *******************************************/
    function getPageIndex($recordPerPage,$currentPage)
    {
        //SET ARRAY REFER TO PARAMETERS:페이지 인덱스 생성을 위한 기본값 정렬
        $pageIndex[totalRecord] = $this->getNumRows();
        $pageIndex[recordPerPage] = $recordPerPage;
        $pageIndex[pagePerBlock] = 10;
        $pageIndex[currentPage] = $currentPage;


        //CALCULATE PAGE IDNEX:
        $pageIndex[totalPage]=ceil($pageIndex[totalRecord]/$pageIndex[recordPerPage]);
        $pageIndex[currentBlock]=ceil($pageIndex[currentPage]/$pageIndex[pagePerBlock]);
        $pageIndex[totalBlock]=ceil($pageIndex[totalPage]/$pageIndex[pagePerBlock]);


        //FIRST PAGE/LAST PAGE
        $pageIndex[firstPage]=($pageIndex[currentBlock]*$pageIndex[pagePerBlock]) – ($pageIndex[pagePerBlock]-1);
        $pageIndex[lastPage]=($pageIndex[currentBlock]*$pageIndex[pagePerBlock]);


        /****************************************
        //DEFINE NEW QUERY_STRING
         페이지 링크 정의를 위한 URL파싱
         ***************************************/
        parse_str($_SERVER[QUERY_STRING],$QUERY_STRING);
        unset($QUERY_STRING[page]);
        foreach($QUERY_STRING as $key=>$value)
        {
            if(!$temp){
                $temp=”$key=$value”;
            }else{
                $temp.=”&$key=$value”;
            }
        }
        $QUERY_STRING=$temp;


        /****************************************
         CREATE PAGE INDEX HTML CODE
         HTML코드 생성
         ***************************************/
        ##PREVIOUS BLOCK
        if($pageIndex[currentPage] > $pageIndex[pagePerBlock])
        {
            $pageIndex[htmlCode]='<a href=”.$_SERVER[PHP_SELF].’?’.$QUERY_STRING.’&page=’.( ($pageIndex[currentBlock]-2)*$pageIndex[pagePerBlock]+1).” target=’_self’ onfocus=’blur();’ > 이전 </a>’;
        }
        ##PAGE INDEX
        for($i=$pageIndex[firstPage]; $i<=$pageIndex[lastPage]; $i++)
        {
            if($i<=$pageIndex[totalPage])
            {
                if($i==$pageIndex[currentPage])
                {
                    $pageIndex[htmlCode].=’ <b>’.$i.'</b>’;
                }else{
                    $pageIndex[htmlCode].='<a href=”.$_SERVER[PHP_SELF].’?’.$QUERY_STRING.’&page=’.$i.” target=’_self’ onfocus=’blur();’ > ‘.$i.’ </a>’;
                }
            }
        }
        ##NEXT BLOCK
        if($pageIndex[currentBlock] <= ($pageIndex[totalBlock]-1) )
        {
            $pageIndex[htmlCode].='<a href=”.$_SERVER[PHP_SELF].’?’.$QUERY_STRING.’&page=’.($pageIndex[currentBlock]*$pageIndex[pagePerBlock]+1).” target=’_self’ onfocus=’blur();’ > 다음 </a>’;
        }


        ##RETURN PAGE INDEX ARRAY
        return $pageIndex;


    }//END METHOD



    /********************************************
     DO SELECT
     *******************************************/
    function doSelect($query)
    {
        $this->query=$query;
        $this->result = $this->doQuery($this->query);
        return mysql_fetch_array($this->result);
    }



    /********************************************
     DO INSERT METHOD
     배열을 참조,데이타베이스에 입력
     *******************************************/
    function doInsert($table,$array)
    {
        ##GET TABLE STRUCTURE
        $query=”SHOW COLUMNS FROM $table”;
        $result=mysql_query($query,$this->CONN);
        while($row=mysql_fetch_array($result) )
        {
            $columns[$i]=$row[Field];
            $values[$i]=”‘”.$array[$columns[$i]].”‘”;
            $i++;
        }


        $columns=implode(“,”,$columns);
        $values=implode(“,”,$values);


        ##SEND QUERY STATEMENT;
        $query=”INSERT INTO $table ($columns) VALUES ($values)”;
        $result=mysql_query($query,$this->CONN);
        if(!$result)
        {
            die(mysql_error() );
            return false;
        }else{
            return true;
        }
    }


    /********************************************
     DO UPDATE METHOD
     업데이트
     *******************************************/
    function doUpdate($table,$array,$key_name,$key_value)
    {
        ##GET TABLE STRUCTURE
        $query=”SHOW COLUMNS FROM $table”;
        $result=mysql_query($query,$this->CONN);
        $i=0;
        while($row=mysql_fetch_array($result) )
        {
            if(isset($array[$row[Field]]) )
            {
                $set[$i]=$row[Field].”='”.$array[$row[Field]].”‘”;
                $i++;
            }
        }
        $set=implode(“,”,$set);


        ##EXECUTE QUERY STATEMENT
        $query=”UPDATE $table SET $set WHERE $key_name=’$key_value'”;
        $this->doQuery($query);
        return true;
    }


        /********************************************
     테이블 리스트 반환
     *******************************************/
        function GetTableList(){
        if($this->result=mysql_list_tables($DB_NAME,$this->CONN)){
        $i=0;
        while($i < mysql_num_rows($this->result)){
        $tb_names[$i]=mysql_tablename($this->result,$i);
        $i++;
        }
        return($tb_names);
        }else
        return $this->errorMessage(“Unable to find any tables in database: $DB_NAME”);
        }


        /********************************************
     필드명 반환
     *******************************************/
        function GetFieldList($tbl_name){
        if($this->result=mysql_list_fields($DB_NAME,$tbl_name,$this->CONN)){
        $i=0;
        while($i < mysql_num_fields($this->result)){
        $fd_names[$i]=mysql_field_name($this->result,$i);
        $i++;
        }
        return($fd_names);
        }else
        return $this->errorMessage(“Unable to find any field list in table: $tbl_name”);
        }


        /********************************************
         returns XML-formatted record rows from query results.
         $this->data holds the XML only, and the function returns the XML header + the data
         example:
         header(“Content-type: text/xml”);
         echo $sql->XML_Output(“SELECT * FROM yourTable”);
         ********************************************/
        function XML_DataOutput($query, $tags = array(‘dataset’,’record’)) {
                if($this->result=mysql_query($query,$this->CONN)) {
                $this->fields=mysql_num_fields($this->result);
                $xmlheader='<?xml version=”1.0″ ?>’.””;
                $this->data.='<‘.$tags[0].’>’.””;
                while($this->rows = mysql_fetch_array($this->result)) {
                $this->data.= “‘”>\\t\\t”.'<‘.$tag.’>’. preg_replace(“/([\\r])/”, ”, strip_tags($this->rows[$i])). ‘</’.$tag.’>’.””;
                }
                $this->data.= “

[함수] __set(), __get() 활용..

글쓴이 kimsee 날 짜 08-02-28 16:58 조 회 2284 도움이 될 지 모르겠지만.. 이런 내용은 없는것 같아서.. 올려봅니다.. connect->query( $input ); $this->results[ $name ] = ( $output ) ? $output : false; } function __get ( $name ) { $output = ( $this->results[ $name ] ) ? $this->result[ $name ]->fetch_assoc() : false; return ( $output ) ? $output : false; } … } $db = new exam(); $db->test = ‘SELECT * FROM test’; echo ‘

‘;
print_r($db->test);
print_r($db->test);
print_r($db->test);
print_r($db->test);
echo ‘
‘; ?> DB 클래스(mysqli)의 경우입니다.. 위처럼 그냥 쿼리만 지정하면.. 값을 부를때는 결과가 나오죠.. 단순히 변수처럼 쿼리를 입력하면 결과를 불러오게 됩니다.. 코드도 간결해 지고.. 편하죠..

[스크립트] 드레그 & 드롭이 되는 메뉴 트리

이걸로 관리자쪽 메뉴트리 다 만들었습니다.

드레그 & 드롭이 되기때문에 메뉴 이동이 매우 편리합니다. ^^;

오픈소스라 맘껏 이용해도 됩니다.

API : http://www.dhtmlgoodies.com/index.html?whichScript=drag-drop-folder-tree

이동은 드레그 & 드롭하면 되고.. 삭제는 메뉴에 오른쪽 버튼을 누르면 DELETE 또는 RENAME을 할 수 있습니다.

소스는 첨부파일 참고


참고로 자스 스크립트가 테이블안에 있으면 IE에서는 오류납니다. 테이블이나

DIV 밖으로 빼십시오.

특정트리는 Nodrag Nodelete NoRename 속성을 추가할 수도 있습니다.

1103230740.zip


mysql UTF-8로 이전하기

[서버운영] utf-8 로 이전하기.[수정]&nbsp;&nbsp;
 
 글쓴이&nbsp;&nbsp; 송효진&nbsp;&nbsp;날 짜 07-12-17 11:15&nbsp;&nbsp;조 회 613
 
 
utf-8 로 이전하기.


1. MySQL


– euckr 스키마 백업
mysqldump –all-databases –no-data –set-charset=euckr -p &gt; backup.scheme.sql


– euckr 자료 백업
mysqldump –all-databases –no-create-db –set-charset=euckr -p &gt; backup.data.sql


웬만하면 사용자계정 정보는 암호까지 확실하게 알고있자.
GRANT ALL 쿼리문을 직접 작성하여 가지고 있자.


– UTF-8 을 제대로 지원하기 위해 버전을 5.x 로 올린다.
(varchar(1) 은 1byte 가 아닌 한글자를 의미하게 된다.
set names 만으로 클라이언트의 캐릭터셋을 맞출 수 있다.)
= backup.scheme.sql =
테이블 중 BLOB 형식이나 BINARY 속성 필드에 문자열이 들어가는 곳이 있다면,
TEXT 형식으로 바꾸거나 BINARY 속성을 없앤다.
DEFAULT \’0\’ 같은 잘못된 따옴표를 고친다.
TYPE=MyISAM 같은건 ENGINE=MyISAM 으로 수정한다.
맨 위쪽의 SET NAMES euckr 을 제외한 모든 CHARACTER SET 의 euckr 을 utf8 로 수정한다.


cat backup.scheme.sql | mysql -p


= backup.data.sql =
head backup.data.sql # 맨 위쪽에 SET NAMES euckr 이 있으면 충분하다.
cat backup.data.sql | mysql -p


– 사용자계정을 GRANT ALL 문으로 다시 만들어준다.
root 지워버리지 않게 주의.



이전 MySQL 에 charset 관련 옵션이 없다면,
스키마는
cat backup.scheme.sql | mysql -p –default-character-set=utf8
데이터는
cat backup.data.sql | mysql -p –default-character-set=euckr
로 복구하면 된다.
스키마는 꼭 꼼꼼히 살펴보고 편집하자.



2. 파일
모든 파일의 내용을 utf8 로 바꾸자.
조건에 따라 동작이 달라지므로 php 를 이용하자.
/toutf.php
&lt;?php


$f = $_SERVER[\’argv\’][1];
if(!file_exists($f)) {
&nbsp;&nbsp;&nbsp;&nbsp;echo $f.\” file not found.\\n\”;
}


$text = file_get_contents($text);
$text8 = @iconv(\’CP949\’, \’UTF-8//IGNORE\’, $text);


$cnt = strlen($text);
$cnt8 = strlen($text8);
if($cnt &lt;= $cnt8) {
&nbsp;&nbsp;&nbsp;&nbsp;// 제대로 변경이 되었다면 용량이 커졌을 것이다.
&nbsp;&nbsp;&nbsp;&nbsp;// 용량이 같다면 한글이 없는 것이다.
&nbsp;&nbsp;&nbsp;&nbsp;rename($f, $f.\’.euckr\’); // 백업
&nbsp;&nbsp;&nbsp;&nbsp;file_put_contents($f, preg_replace(\’/charset=euc-kr/i\’, \’charset=utf-8\’, $text8));
&nbsp;&nbsp;&nbsp;&nbsp;echo $f.\” file is converted.\\n\”;
} else {
&nbsp;&nbsp;&nbsp;&nbsp;// 용량이 작아진다면 잘못된 것이다.
&nbsp;&nbsp;&nbsp;&nbsp;$fp = fopen(\’/error.txt\’, \’a\’);
&nbsp;&nbsp;&nbsp;&nbsp;fwrite($fp, $f.\”\\n\“);
&nbsp;&nbsp;&nbsp;&nbsp;fclose($fp);
}


?&gt;


find /home -type f -name \”*.php\” -exec php /toutf.php \”{}\” \\;
find /home -type f -name \”*.inc\” -exec php /toutf.php \”{}\” \\;
find /home -type f -name \”*.txt\” -exec php /toutf.php \”{}\” \\;
find /home -type f -name \”*.html\” -exec php /toutf.php \”{}\” \\;
find /home -type f -name \”*.htm\” -exec php /toutf.php \”{}\” \\;
find /home -type f -name \”*.js\” -exec php /toutf.php \”{}\” \\;
find /home -type f -name \”*.css\” -exec php /toutf.php \”{}\” \\;



현재 UTF-8 이 아닌 곳이 없기 때문에,
기억을 더듬어 대충 만들었다.
적용전 백업은 필수다.


에디터는 EmEditor, DreamWeaver CS3 를 추천한다.
FTP 는 WinSCP 4 를 추천한다. 윈도 커멘더 모드로 하면 파일명이 지X 같아도 잘 올리고 받아질 것이다.


WinSCP 의 에디터로 EmEditor 를 설정하면 무적이다.
EmEditor 는 기능이 조금 제한된 free 버전이 있다.
 
&nbsp;&nbsp;License
본 게시물은 GPL을 따릅니다. [ GPL 안내 ]&nbsp;&nbsp;
 
 


&nbsp;&nbsp;
&nbsp;&nbsp; 송효진&nbsp;&nbsp; 07-12-17 11:19&nbsp;&nbsp;
음… euckr 용 php 글자자르기 함수에 문제가 있을 수 있겠네요.


my.cnf 에서 default-character-set 만 잘 맞춰주면,
DB 접속시에 set names utf8 은 안해도 될겁니다.
그래도 php 에다 저거 한줄 추가하는게 속 편할것 같네요.&nbsp;&nbsp;
 
음… euckr 용 php 글자자르기 함수에 문제가 있을 수 있겠네요.


my.cnf 에서 default-character-set 만 잘 맞춰주면,
DB 접속시에 set names utf8 은 안해도 될겁니다.
그래도 php 에다 저거 한줄 추가하는게 속 편할것 같네요.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; 전진하는아르고&nbsp;&nbsp; 07-12-17 12:07&nbsp;&nbsp;
여러 도메인을 사용할때를 대비해서 한줄추가가 가장 속 편한듯 싶네요.&nbsp;&nbsp;
 
여러 도메인을 사용할때를 대비해서 한줄추가가 가장 속 편한듯 싶네요.
&nbsp;&nbsp;
&nbsp;&nbsp; 신의손&nbsp;&nbsp; 07-12-17 11:26&nbsp;&nbsp;
스크랩했습니다. 이번 서버업글때 써먹어야겠네요.. 좋은정보 감사합니다.^^&nbsp;&nbsp;
 
스크랩했습니다. 이번 서버업글때 써먹어야겠네요.. 좋은정보 감사합니다.^^
&nbsp;&nbsp;
&nbsp;&nbsp; 허생&nbsp;&nbsp; 07-12-17 11:27&nbsp;&nbsp;
예전에 UTF-8로 이전할때 파일을 하나하나 따로 열어서 속성을 변경해줬던 기억이 있는데…
이렇게 한방에 해결가능하군요… 역시 무식하면 손발이 고생~&nbsp;&nbsp;
 
예전에 UTF-8로 이전할때 파일을 하나하나 따로 열어서 속성을 변경해줬던 기억이 있는데…
이렇게 한방에 해결가능하군요… 역시 무식하면 손발이 고생~
&nbsp;&nbsp;
&nbsp;&nbsp; 송효진&nbsp;&nbsp; 07-12-17 11:41&nbsp;&nbsp;
생각해 보니 iconv 로 해야 원하는 동작이 되어 살짝 수정했습니다.&nbsp;&nbsp;
 
생각해 보니 iconv 로 해야 원하는 동작이 되어 살짝 수정했습니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; 전진하는아르고&nbsp;&nbsp; 07-12-17 12:08&nbsp;&nbsp;
쩝 근데… 이왕이면 페이지속의 메타태그도… ㅎㅎㅎ&nbsp;&nbsp;
 
쩝 근데… 이왕이면 페이지속의 메타태그도… ㅎㅎㅎ
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; 송효진&nbsp;&nbsp; 07-12-17 12:51&nbsp;&nbsp;
그건 되어 있어요.ㅎㅎ&nbsp;&nbsp;
 
그건 되어 있어요.ㅎㅎ
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; 전진하는아르고&nbsp;&nbsp; 07-12-17 14:27&nbsp;&nbsp;
헉… 글쿤요.. 착각했네요.. 요즘 착각을 자주하는걸 보니… 명퇴할때가 되었나 쩝…&nbsp;&nbsp;
 
헉… 글쿤요.. 착각했네요.. 요즘 착각을 자주하는걸 보니… 명퇴할때가 되었나 쩝…
&nbsp;&nbsp;
&nbsp;&nbsp; x딜마&nbsp;&nbsp; 07-12-17 11:46&nbsp;&nbsp;
좋은 정보 감사 드립니다.
개발 한것 UTF용으로 변환 할려고 계획중이었는데.. 쉽게 처리 될것 같네요.&nbsp;&nbsp;
 
좋은 정보 감사 드립니다.
개발 한것 UTF용으로 변환 할려고 계획중이었는데.. 쉽게 처리 될것 같네요.
&nbsp;&nbsp;
&nbsp;&nbsp; 전진하는아르고&nbsp;&nbsp; 07-12-17 12:11&nbsp;&nbsp;
참고로 저는 euckr에서 옮길때 sql 화일 덤프 받아서 set names euckr 주고 utf8 이 아닌 문서로 올렸더니
에러가 생겼습니다. 그래서 아예 utf8로 sql 파일을 변경하고 올립니다.&nbsp;&nbsp;
 
참고로 저는 euckr에서 옮길때 sql 화일 덤프 받아서 set names euckr 주고 utf8 이 아닌 문서로 올렸더니
에러가 생겼습니다. 그래서 아예 utf8로 sql 파일을 변경하고 올립니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; 송효진&nbsp;&nbsp; 07-12-17 12:54&nbsp;&nbsp;
euckr 로 하는 이유는,
흔하지는 않지만 euckr 의 멀티바이트 코드 마저 escape 시켜버리는 것이 있습니다.
예를 들자면, ㅂㅞㄺ 인데 ?\\\’? 이런식이랄까요?
이건 변환이 안되지요.
그런데, euckr 로 넣으면 원래 그런 escape 기 때문에 동작을 합니다.
아마 오류가 스키마에서 났을듯 합니다.
예제에서처럼 분리하여 해 보시면 문제 없을듯 하네요.&nbsp;&nbsp;
 
euckr 로 하는 이유는,
흔하지는 않지만 euckr 의 멀티바이트 코드 마저 escape 시켜버리는 것이 있습니다.
예를 들자면, ㅂㅞㄺ 인데 ?\\\’? 이런식이랄까요?
이건 변환이 안되지요.
그런데, euckr 로 넣으면 원래 그런 escape 기 때문에 동작을 합니다.
아마 오류가 스키마에서 났을듯 합니다.
예제에서처럼 분리하여 해 보시면 문제 없을듯 하네요.
&nbsp;&nbsp;
&nbsp;&nbsp; 낭망백수&nbsp;&nbsp; 07-12-17 12:35&nbsp;&nbsp;
전체적으로
버전 5.x 로의 이전에 해당하는 것과 UTF-8로의 이전에 해당하는 것을 좀 가릴 필요가 있겠는데요.
그리고 이왕이면 각 수정항목에 대한 설명도. ^^;;;


진짜 궁금한건 BINARY 를 왜 없애야하는지 궁금합니다.
전부터 궁금했는데 아직도 이유를 모르겠네요. 매뉴얼이나 MySQL 사이트설명도 애매하고. ㅋ


제가 생각하는 제일 간단한 방법은 밀어넣을때 setCharacter 지정하는 것이아니라
밀어넣는 것은 그대로 걍 sql로 밀어넣고
신버젼의 Database 만(스키마없이) UTF-8 로생성하고 나머지 그대로 걍 다 밀어넣는것입니다.
들어갈때 알아서 UTF-8 바뀌더군요.
(BINARY 는 바꾸지 않았는데 괜찮더군요. 앞으로 무슨 문제가 있을지 모르겠지만 ㅡㅡ;;)


꾸벅~!&nbsp;&nbsp;
 
전체적으로
버전 5.x 로의 이전에 해당하는 것과 UTF-8로의 이전에 해당하는 것을 좀 가릴 필요가 있겠는데요.
그리고 이왕이면 각 수정항목에 대한 설명도. ^^;;;


진짜 궁금한건 BINARY 를 왜 없애야하는지 궁금합니다.
전부터 궁금했는데 아직도 이유를 모르겠네요. 매뉴얼이나 MySQL 사이트설명도 애매하고. ㅋ


제가 생각하는 제일 간단한 방법은 밀어넣을때 setCharacter 지정하는 것이아니라
밀어넣는 것은 그대로 걍 sql로 밀어넣고
신버젼의 Database 만(스키마없이) UTF-8 로생성하고 나머지 그대로 걍 다 밀어넣는것입니다.
들어갈때 알아서 UTF-8 바뀌더군요.
(BINARY 는 바꾸지 않았는데 괜찮더군요. 앞으로 무슨 문제가 있을지 모르겠지만 ㅡㅡ;;)


꾸벅~!
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; 송효진&nbsp;&nbsp; 07-12-17 12:54&nbsp;&nbsp;
BINARY 는 말 그대로 바이너리 입니다.
캐릭터 취급을 안하지요. 캐릭터셋 변환이 안되요.
구 버전에서 BINARY 를 썼던 이유중 가장 큰것이,
latin1 으로 해서 정렬이 엉망이 되기 때문이었지요.


5.x 는 필수라고 생각해서 나누지는 않고 당의성에 대한 설명을 추가했습니다.&nbsp;&nbsp;
 
BINARY 는 말 그대로 바이너리 입니다.
캐릭터 취급을 안하지요. 캐릭터셋 변환이 안되요.
구 버전에서 BINARY 를 썼던 이유중 가장 큰것이,
latin1 으로 해서 정렬이 엉망이 되기 때문이었지요.


5.x 는 필수라고 생각해서 나누지는 않고 당의성에 대한 설명을 추가했습니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; 낭망백수&nbsp;&nbsp; 07-12-17 13:02&nbsp;&nbsp;
그럼 binary packing 이 어떻게 이루어지는지 궁금하군요. unpacking 은?
(그런데 왜 저는 제대로 나올까요? ㅡㅡ;)


ps; 짐 free emeditor 기능제한이 뭐죠? 쓰다가 적응안되서 포기한 1人&nbsp;&nbsp;
 
그럼 binary packing 이 어떻게 이루어지는지 궁금하군요. unpacking 은?
(그런데 왜 저는 제대로 나올까요? ㅡㅡ;)


ps; 짐 free emeditor 기능제한이 뭐죠? 쓰다가 적응안되서 포기한 1人
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; 송효진&nbsp;&nbsp; 07-12-17 13:12&nbsp;&nbsp;
PostgreSQL 과는 개념이 조금 다릅니다.
pgsql 에서는 bytea 로 패킹을 하지만,
MySQL 에서는 패킹하는것이 아니고, 그냥 binary 취급만 해 주는 것입니다.
varchar(1) binary 는 1byte 를 의미하게 되겠죠.


utf-8 로의 이전시에 iconv 로 변환하거나 한 적이 없는데,
set names euckr 로 잘 들어갔다면,
php 에서도 set names euckr 인 상태가 아닌지 확인이 필요하겠습니다.


emeditor free 는 tools 없고 (diff 등), 탐X기 마우스 우클릭에 메뉴 없다는것 정도 입니다.
트레이 아이콘 제공도 안하던가…
기본적으로 utf-8 이 아니기 때문에 옵션은 조금 손봐줄 필요가 있습니다.
가장 좋게 생각하는 기능이 우하단의 현재 캐릭터셋 표시를 더블클릭하면,
바로 어떤 캐릭터셋으로든 다시 불러올 수 있다는 것입니다.
다른 이름으로 저장시에 어떤 캐릭터셋으로도 변환할 수 있고요.&nbsp;&nbsp;
 
PostgreSQL 과는 개념이 조금 다릅니다.
pgsql 에서는 bytea 로 패킹을 하지만,
MySQL 에서는 패킹하는것이 아니고, 그냥 binary 취급만 해 주는 것입니다.
varchar(1) binary 는 1byte 를 의미하게 되겠죠.


utf-8 로의 이전시에 iconv 로 변환하거나 한 적이 없는데,
set names euckr 로 잘 들어갔다면,
php 에서도 set names euckr 인 상태가 아닌지 확인이 필요하겠습니다.


emeditor free 는 tools 없고 (diff 등), 탐X기 마우스 우클릭에 메뉴 없다는것 정도 입니다.
트레이 아이콘 제공도 안하던가…
기본적으로 utf-8 이 아니기 때문에 옵션은 조금 손봐줄 필요가 있습니다.
가장 좋게 생각하는 기능이 우하단의 현재 캐릭터셋 표시를 더블클릭하면,
바로 어떤 캐릭터셋으로든 다시 불러올 수 있다는 것입니다.
다른 이름으로 저장시에 어떤 캐릭터셋으로도 변환할 수 있고요.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; 낭망백수&nbsp;&nbsp; 07-12-17 13:22&nbsp;&nbsp;
오호~ 오호~ 연발이군요. 감사합니다. 스트랩도 하구요. ^^;&nbsp;&nbsp;
 
오호~ 오호~ 연발이군요. 감사합니다. 스트랩도 하구요. ^^;
&nbsp;&nbsp;
&nbsp;&nbsp; 하늘처럼™&nbsp;&nbsp; 07-12-17 13:09&nbsp;&nbsp;
이제 스쿨이 utf-8로 가는 일만 남은거죠?&nbsp;&nbsp;
 
이제 스쿨이 utf-8로 가는 일만 남은거죠?
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; 낭망백수&nbsp;&nbsp; 07-12-17 13:21&nbsp;&nbsp;
ㅎㅎㅎㅎ.&nbsp;&nbsp;
 
ㅎㅎㅎㅎ.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; 전진하는아르고&nbsp;&nbsp; 07-12-17 14:28&nbsp;&nbsp;
스쿨은 euc-kr 였군요…&nbsp;&nbsp;
 
_PS||MG__PS||MG__PS||MG__PS||MG__PS||MG__PS||MG__PS||MG__PS||MG__PS||MG__PS||MG__PS||MG_