Posted
Filed under Action Script
String.prototype.replace = function(find, replace) {
    var temp_array = this.split(find);
     return temp_array.join(replace);   
};

action script 2.0에는 포함 되어 있지 않는 string replace....
2009/10/23 16:55 2009/10/23 16:55
Posted
Filed under Linux
-----------------------------------------------------------------
 
00 03 * * * su - root -c '/root/bin/su_backup --local' >& /dev/null
00 07 * * * su - root -c '/root/bin/system_check' >& /dev/null
*/5 * * * * su - root -c '/root/bin/system_test >& /dev/null'
 
-----------------------------------------------------------------

 
위 세줄은 배포 메뉴얼에 나와있는 내용이고
시스템 점검 및 자동백업을 위해 vi /etc/crontab 하라는 내용입니다.
 
헌데 system_test 파일이 저 경로에 없을뿐더러
내용을 구지 crontab에 적어 넣으실 필요가 없습니다.
 
일단 system_test 파일은 /root/bin/sbin 디렉토리에 있고
위 세가지 항목은 /etc/cron.d 디렉토리의 ssu 파일에 기록되어 있기 때문입니다.
 
다만 주석이 달려있기 때문에 vi로 파일을 여신 후
필요하신 항목의 주석만 제거하시고 저장하시면 됩니다.
 
 
-----------------------------------------------------------------
 
[원문] - https://www.sulinux.net/bbs/board.php?bo_table=success_2&wr_id=179&page=0

#00 03 * * * su - root -c '/root/bin/su_backup --local' >& /dev/null
00 07 * * * su - root -c '/root/bin/system_check' >& /dev/null
*/5 * * * * su - root -c '/root/bin/system_test >& /dev/null'
 
-----------------------------------------------------------------
 
저는 시스템 백업을 받지 않기 때문에 두,세번째 행의 주석만 제거했습니다.
 
 
 
-----------------------------------------------------------------
 
Sep 11 17:35:01 ma crond[19606]: (root) CMD (/root/bin/sbin/system_test -q >& /dev/null )
Sep 11 17:40:01 ma crond[19714]: (root) CMD (/root/bin/sbin/system_test -q >& /dev/null )
Sep 11 17:45:01 ma crond[19822]: (root) CMD (/root/bin/sbin/system_test -q >& /dev/null )
Sep 11 17:50:01 ma crond[23980]: (root) CMD (/root/bin/sbin/system_test -q >& /dev/null )
Sep 11 17:55:01 ma crond[27485]: (root) CMD (/root/bin/sbin/system_test -q >& /dev/null )
 
-----------------------------------------------------------------
 
위 내용은 수정 후 /var/log/cron의 system_test 관련 로그입니다.
설정대로 정확히 5분마다 실행된 흔적이 찍혔군요 ^^
 
이제 system_check 한번 돌리시거나 아침에 job이 실행되면
웹으로 접속하셔서 결과 화면을 보시면 되겠습니다.
2009/10/20 14:29 2009/10/20 14:29
Posted
Filed under Htm&Javascript
script language="javascript">
<!--
    function setClip() {
      window.clipboardData.setData('Text', "텍스트 내용");
    }
//-->
</script>
2009/10/14 19:50 2009/10/14 19:50
Posted
Filed under Action Script

[참조] - http://www.happyfri.com/blog/177
우선 맥클레이씨가 올린 포스트 보자.
그가 최근까지 버그로 알고 있었던 두가지중 나머지 하나이다. (하나는 이전에 포스트한 bitmap with shape)
와...나도 이거는 버그로 알고 있었는데...확실하게 그 궁금정이 풀렸다. 이 문제를 정확히 해결한건 http://www.kirupa.com/forum 에 올라온 질문글에 대한 답변글을 단 glosrfc 분의 명쾌한 설명이다. 물론 나도 예전에 TexfField와 관련된 버그포스트에서 이와 유사한 내용을 짚고 넘어간 적이 있지만 Auto Kerning이 이런 기능을 할줄은 전혀 생각을 못했다.

내용의 요지는
만약 저작툴상에서(ActionScript로 만든 Textfield 가 아닌...) 생성한 텍스트필드는 그 태생의 근원이 static에서 파생된 것으로 볼수 있는데... 이때 multiline이 체크되었을경우 해당 텍스트필드에 내용을 추가하면 이때 첫라인이 (line break) 되어 버린다는 것이다.(줄바꿈현상)
이 현상을 대부분 아마 겪어 보았을터인데...내경우엔 이것을 해결하기 위해 a.text = ''; 처럼 맨처음 초기화를 먼져시켜두고 작업을 했던 기억이 난다.

 F   ?
1
a.appendText('우리가');



  첫라인이 자동줄바꿈 되는현상


 문제가 되는 원인을 픽스

그런데 이문제는 Auto Kern 과 관련이 있다고 한다.
이것은 싱글라인은 상관없고 오로지 다중라인 일경우 처리되는데 이를테면 디폴트 값으로 <p></p>태그가 포함되어 있기때문에 이녀석 때문에 실제로 그렇게 보인것이다. 이부분을 glosrfc씨는 아래와 같이 설명하고 있다.

With auto kerning selected, Flash adds some invisible HTML tags to the textfield which are ignored in single line mode. However, switching to multi line mode activates the HTML <P> tag and so you end up getting this spurious line break.



htmlText를 추가할때 += 연산자를 포함시키면 자동으로 <p>태그가 추가된다는 것이다.
따라서 이부분을 해결하기 위해서는 별도의 변수에 htmlText 값을 담고 그것을 최종적으로 추가시키는 작업이 더 주요하다고 한다. (일종의 text를 추가할때 tfd.text += 'test'; 대신 속도문제로 tfd.appendText('test')를 권고하는것과 마찬가지 개념으로 이해하면 되겠다.)

어쨌든 이렇게 궁금했던 부분이 해결되서 정말 기분좋다.
항상 하는말이지만 좋은 내용들을 포스트해준 맥클레이씨와 좋은 팁을 알려준 glosrfc 라는 분께 감사의 말을 전한다.
(thanks for good tip trevor, thank you glosrfc )

2009/10/12 20:13 2009/10/12 20:13
Posted
Filed under Action Script

_print_for_movieClip(printBtn,"./print.jpg");

 function _print_for_movieClip(print_btn:Object, image_url:String):Void{
      this.createEmptyMovieClip("holder_mc",this.getNextHighestDepth());
      holder_mc.loadMovie(image_url,holder_mc)
      holder_mc._visible=false;
      holder_mc._x=holder_mc._y=-1000;
      print_btn.onRelease=function(){
           print(this._parent.holder_mc,"bframe");
      }
}
2009/10/12 15:38 2009/10/12 15:38
Posted
Filed under Action Script

[Flash] /attachment/1097207770.swf



stop();
//환경 설저
var line_count:Number =3 ; //선 개수 총 3일 경우 점 6개 성성됨 aa0 ~ aa5;
var id:Number=0;
var temp:MovieClip=null;
var lineptr:MovieClip=null;


for(var i:Number=0; i<line_count; i++){
 this["aa"+ i].loc=-1;
 
 this["aa"+ i].onRelease=function(){
  create_line_object(this);
 }
 //group 설정
 this["aa"+ i].ngroup=i;
 
 //대상 group 설정
 this["aa"+ ((line_count)+i)].loc=-1;
 this["aa"+ ((line_count)+i)].ngroup = i;
 this["aa"+ ((line_count)+i)].onRelease=function(){
  line_to_line(this);
 }
}

function line_to_line(mc:MovieClip){
 if(temp.Status=="on" &&  temp.ngroup == mc.ngroup){
  trace("동일그룹");
  //이벤트 처리
 
 }else{
  trace("서로다른그룹");
  //이벤트 처리
 
 // remove_object(temp);
 // remove_ojbect(lineptr);
 }
 
 if(mc.loc==-1 &&  temp.Status=="on" &&  temp.ngroup == mc.ngroup ){
   
   this["aa"+temp.anum].loc = mc._name.substr(2,3);
   
   mc.loc = this["aa"+temp.anum]._name.substr(2,3);
   
   Mouse.show();
   lineptr=null;
   temp.onMouseMove=null;
   temp.null;
   temp.Status="off";
  }//inner if end
 
  if(is_line_draw_complate()==true){
   if(_check()==true){
    trace("complate");
    mx.behaviors.DepthControl.bringToFront(answer_0);
    answer_0.gotoAndPlay(2);
   }else{
    trace("try_again");
    mx.behaviors.DepthControl.bringToFront(answer_x);
    answer_x.gotoAndPlay(2);
   }
 
   //이벤트 풀어버리기
   for(var i:Number=0; i<line_count; i++){
    this["aa"+ i].onRelease=this["aa"+ ((line_count)+i)].onRelease=false;
   }
  }//inner if end
 }


function create_line_object(mc:MovieClip){
 if(temp.Status=="on"){
 
 }else{
  if(mc.loc==-1){
   duplicate_object(mc);
  }
 }
}


function remove_object(mc:MovieClip){
 trace("객체 삭제:"+mc);
 mc.onMouseMove=null;
 removeMovieClip(mc._name);
 Mouse.show();
}


function duplicate_object(mc:MovieClip){
 temp = mc.duplicateMovieClip("mc"+id,++id);
 temp.ngroup = mc.ngroup;
 temp.Status = "on";
 temp.anum = Number(mc._name.substr(2,3));
 Mouse.hide();
 
 temp.onMouseMove = function() {
  this._x = this._parent._xmouse;
  this._y = this._parent._ymouse;
 // lineptr.moveTo(_xmouse - Number(lineptr._x) ,_ymouse-Number(lineptr._y)); //y좌표
  lineptr.clear();
  lineptr=null;
  crate_line();
  lineptr.lineTo(_xmouse - Number(lineptr._x) ,_ymouse-Number(lineptr._y)); //x좌표;
  lineptr.moveTo(0,0);
 };
}


//라인생성
function crate_line(){
 trace("temp:"+temp.anum);
 this.Mouse.show();
 lineptr=this.createEmptyMovieClip("line_mc", ++id);
 lineptr.lineStyle(5, 0xff00ff, 50, true, "normal", "square", "miter", 1);
 lineptr._currentx = lineptr._x=this["aa"+temp.anum]._x;
 lineptr._currenty =lineptr._y=this["aa"+temp.anum]._y;
}


//정답 체크

function _check():Boolean{
 var retval:Boolean=false;
 for(var i:Number=0; i<line_count; i++){
  trace("target_group:" + this["aa"+this["aa"+i].loc].ngroup );
  if(this["aa"+this["aa"+i].loc].ngroup == this["aa"+i].ngroup){
   retval = true;
  }else{
   retval = false;
   break;
  }
 }
 return retval;
}

function is_line_draw_complate():Boolean{
 var retval:Boolean=false;
 for(var i:Number=0; i<line_count; i++){
  if(this["aa"+i].loc!=-1){
   retval = true;
  }else{
   retval = false;
   break;
  }
 }
 return retval;
}

2009/10/01 11:34 2009/10/01 11:34
Posted
Filed under Htm&Javascript
function GetSearchQuery(strName){
    var oLocation = location.href;
     if(oLocation.indexOf('?') > 0){
      var strUri = oLocation.split('?');
      var strParam = strUri[1].split('&');
      for(var i=0; i<strParam.length; i++){
       if(strParam[i].indexOf('=') > 0){
        var strQuery = strParam[i].split('=');
        if(strQuery[0] == strName)
          return strQuery[1];
       }
      }//end for
     }//end if
    return "";
   }
2009/09/28 13:45 2009/09/28 13:45
Posted
Filed under Linux

출처 : http://bluesky.husband.be/archives/337 

 

Sendmail mqueue setting about resend issue - 메일 재송신 하지 않도록 설정

- The language of this post; Korean

- in Korean;

Sendmail mqueue를 설정할 필요성을 느끼게 된 것은, 운영중인 한 시스템에서 대량으로 메일을 발송하는데, 없는 주소이거나 시스템 거부로 인하여 메일이 송신되지 않으면, 계속해서 재송신 하려하는 문제점을 해결하기 위해서 였다.

Mail Queue Redhat계열의 경우 보통 /var/spool/mqueue 에 위치하며, Sendmail을 통하여 메일을 송신하면 일단 이 queue에 저장이 된다. 그리고 시스템 자원을 보아 가며 메일을 조금씩 보내게 되는데, 메일 송신이 실패하면 해당 서버로부터 에러메시지나, 회송처리된 메일을 돌려받게 되는데, 이러한 메일들의 처리 역시 mqueue가 담당을 하기에 정상적인 메일이 아닌 메일로 다량 메일을 보내거나 하면, mqueue가 금방 수많은 파일들로 북적대게된다.

이번 서비스의 문제는 이렇다.

1.     대량의 메일주소로 메일을 보낸다.

2.     메일이 보내지면 문제가 없지만, 다시 대량으로 반송된다.

3.     반송된 메일을 queue에 보관한다.

4.     정기적으로 queue에 보관된, 송신되지 못한 메일을 보낸다. 다시 반송된다.

5.     결국 언젠가는 파기되지만, 파기될 때 다시 보낸 사람에게 메일이 돌아온다.

여기서 정기적으로 다시 메일을 송신하는 부분과, queue에서 보관중인 메일을 파기할 때 다시 보낸 사람에게 메일을 돌려보내는 작업은 시스템 자원 낭비라고 판단. 이를 해결해 보고자한다.

우선 알아 두어야 할 명령어 사용 법을 알아보도록 한다.

1. mqueue의 처리 상황을 확인하는 명령

/usr/sbin/sendmail -bp

아래는 큐에 처리할 메일이 없을 경우 이다. 멀티큐 설정으로 q1 ~ q6의 디렉토리가 보인다.

[root@www mqueue]# sendmail -bp
/var/spool/mqueue/q2 is empty
/var/spool/mqueue/q1 is empty
/var/spool/mqueue/q3 is empty
/var/spool/mqueue/q6 is empty
/var/spool/mqueue/q5 is empty
/var/spool/mqueue/q4 is empty
Total requests: 0

아래는 mqueue에 처리되고 있는 메일이 있는 경우이다.

[root@www mqueue]# /usr/sbin/sendmail -bp
/var/spool/mqueue/q5 (20 requests)
—–Q-ID—– –Size– —–Q-Time—– ————Sender/Recipient———–
lAF2oPUX014911 2295 Thu Nov 15 11:50 MAILER-DAEMON
(Deferred: local mailer (/usr/bin/procmail) exited with EX_TE)
<root@xxx.com>
apache
lAF2oPUZ014911 4071 Thu Nov 15 11:50 MAILER-DAEMON
(Deferred: local mailer (/usr/bin/procmail) exited with EX_TE)
root
apache
lAF2oPUp014911 8627 Thu Nov 15 11:50 MAILER-DAEMON
(Deferred: local mailer (/usr/bin/procmail) exited with EX_TE)
root
apache
lAF2oPUt014911 10026 Thu Nov 15 11:50 MAILER-DAEMON
(Deferred: local mailer (/usr/bin/procmail) exited with EX_TE)
root
apache

Total requests: 20

2. aliases 업데이트

sendmail -bi newaliases가 결국 같은 명령이다.

[root@www mqueue]# sendmail -bi

/etc/aliases: 78 aliases, longest 109 bytes, 1022 bytes total

[root@www mqueue]# newaliases

/etc/aliases: 78 aliases, longest 109 bytes, 1022 bytes total

그러면, 이제는 mqueue의 설정에 관하여 알아보도록 하자.

모두 /etc/mail/sendmail.cf 에서의 설정이다.

3. MinQueueAge=30m

mqueue의 메일 재발송 시간 설정. Timeout 설정 이전에 적용되는 우선적인 옵션으로, 발송에 실패한 메일이 다시 재발송을 시도하기까지의 대기 시간을 설정 한다. 기본값은 30분이며 기본적으로 서버부하를 줄이기 위해 # 주석처리 되어있지만 필요로 한다면 사용하여도 무방하다. /etc/rc.d/init.d/sendmail 스크립트에 /usr/sbin/sendmail -bd -q1h 로 설정이 되어 있는데 q1h queue 1hour 이라는 뜻으로 옵션으로 설정할 수도 있다.

4. Timeout.queuereturn=5d

특정한 사유로 인해 메일이 전달되지 못하고 mqueue 에보관되고 있을경우의 보관 기간을 지정하는것으로 기본값은 5일이다. 이기간을 넘길경우 메일은 자동적으로 최초 발신지로 되돌려져 반송처리가 된며, queue에 보관된 메일은 파기된다.

5. Timeout.queuewarn=4h

- 역시 특정한 사유로 인해 메일이 전달되지 못할경우, 최초 발신자에게 메일이 전달되지 못하고 있음을 경고하는 경고메일이 발송 되기까지의 대기 시간을 지정하며 기본값은 4시간이다.

실제 sendmail.cf에 설정한 내용은 다음과 같다.

# timeouts (many of these)
#O Timeout.queuereturn=5d
O Timeout.queuereturn=1s
O Timeout.queuewarn=4h

단지 Timeout.queuereturn=5d 1s 1초로 바꾼 것으로 메일을 보내고 1초간 mqueue에 저장하며 이로 인하여 바로 메일을 송신자에게 반송 한 후, 송신한 메일queue는 파기한다. 다른 설정은 모두 mqueue에 메일이 있을 경우에 해당하는 설정이므로 Timeout.queuereturn설정만 바꿔주었다.

하지만 여기에도 문제가 있었다. 송신에 실패한 메일을 바로 파기하는것 까지는 좋았는데, 그 다음에는 되돌아온 메일을 송신자에게 보내려는 메일로 mqueue가 가득 차게 되는 것이었다. 그래서 반송되어진 메일큐의 메일들을 지우는 스크립트를 작성하고 cron에 등록하여 주기적으로 삭제해 주기로 결정하였다. 물론 대량으로 보내는 메일이 아닌, 개인이 주고받는 메일은 삭제하면 안되기 때문에, 메일의 내용을 보아가며 삭제할지 여부를 판단해야만 했다. - 여기서의 메일은 모두 메일 큐에 쌓여있는 메일이다.

결국 필요한동작은,

mqueue 이하의 모든 파일의 내용을 검색하여 특정 문자열 - 여기서는 E-mail주소 - 이 있는 파일들만 삭제

하는 기능인데 다음과 같이 구현하였다.

삭제 대상 파일은 두가지.

1.     1초뒤 메일을 파기하여 송신자에게 보내는 메일

2.     메일 송신 대상 서버로부터 송신자에게 온 에러 메일

6. 메일을 파기하고 송신자에게 반송하는 메일 찾아 지우기

송신자가 support@xxx.com 이라는점을 이용, ‘To: <support@xxx.com>’로 검색을 하였다.

[ 찾는 방법 ]

find /var/spool/mqueue -type f -exec egrep -i “To: <support@xxx.com>” /dev/null {} \; | awk -F: ‘{print $1}’

[ 찾아 지우는 방법 ]

find /var/spool/mqueue -type f -exec egrep -i “To: <support@xxx.com>” /dev/null {} \; | awk -F: ‘{print $1}’ | sed “s/.*/rm -rf \0/” | bash

 

맨 뒤의 bash sh로 치환해도 동작한다. 해당 shell로 실행하라는 것임

7. 상대 서버로부터 송신자에게 온 에러 메일 찾아 지우기

송신자가 support@xxx.com 이라는점을 이용, ‘Return-Path: <support@xxx.com>’로 검색을 하였다.

[ 찾는 방법 ]

find /var/spool/mqueue -type f -exec egrep -i “Return-Path: <support@xxx.com>” /dev/null {} \; | awk -F: ‘{print $1}’

[ 찾아 지우는 방법 ]

find /var/spool/mqueue -type f -exec egrep -i “Return-Path: <support@xxx.com>” /dev/null {} \; | awk -F: ‘{print $1}’ | sed “s/.*/rm -rf \0/” | bash

 

맨 뒤의 bash sh로 치환해도 동작한다. 해당 shell로 실행하라는 것임

이렇게 하여, 1초만에 메일을 파기하고, 이에따른 잔류메일을 mqueue에서 삭제하는 방법을 알아보았다.

프로그래밍을 하지 않고 최대한 한줄로 줄여보려고 노력한 결과, 위와 같이 되었다. ^^; 어쨌든 결과는 만족스럽다. 서버관리자의 길은 멀고도 험하다. - 서버 관리자 아닌데요… -

- Reference links;

2009/09/15 09:55 2009/09/15 09:55
Posted
Filed under Mysql

[원문]http://blog.naearu.com/2982861
12.3.
스트링 함수

= "urn:schemas-microsoft-com:office:office" /> 

  12.3.1. 스트링 비교 함수

 

스트링-값 함수는 그 결과 값의 길이가 max_allowed_packet 시스템 변수의 값 보다 클 경우에는, NULL을 리턴한다. Section 7.5.2, “서버 파라미터 튜닝하기를 참조할 것.


스트링 포지션(position)에서 연산을 하는 함수의 경우, 첫 번째 포지션은 숫자 1된다 .

  • ASCII(str )

스트링 str 왼쪽 문자의 숫자 값을 리턴한다. str 이 빈 스트링(empty string) 경우에는 0 을 리턴한다. NULL if str NULL일 경우에는 NULL 을 리턴한다. ASCII() 0 에서 255 사이의 숫자 값을 갖는 문자에 대해서 연산을 한다.

mysql> SELECT ASCII('2');

        -> 50

mysql> SELECT ASCII(2);

        -> 50

mysql> SELECT ASCII('dx');

        -> 100

ORD() 함수를 함께 참조할 것.

  • BIN(N)

N 바이너리 값에 대한 스트링 표현식을 리턴하는데, 여기에서N (BIGINT) 숫자이다. 이것은 CONV(N,10,2)과 동일하다. N NULL일 경우에는 NULL을 리턴한다.

mysql> SELECT BIN(12);

        -> '1100'

  • BIT_LENGTH(str)

스트링 str 의 길이를 비트 단위로 리턴한다.

mysql> SELECT BIT_LENGTH('text');

        -> 32

  • CHAR(N,... [USING charset_name])

CHAR() 각각의 인수 N 을 정수 형태로 해석을 하고 이러한 정수의 코드 값에 의해 주어지는 문자로 구성된 스트링을 리턴한다. NULL 값은 무시(skipped)된다.

mysql> SELECT CHAR(77,121,83,81,'76');

        -> 'MySQL'

mysql> SELECT CHAR(77,77.3,'77.3');

        -> 'MMM'

MySQL 5.0.15 이후 버전에서는,  255 보다 CHAR() 인수는 여러 개의 결과 바이트로 변환된다. 예를 들면, CHAR(256) CHAR(1,0)와 같고, 그리고 CHAR(256*256) CHAR(1,0,0) 과 같다:

mysql> SELECT HEX(CHAR(1,0)), HEX(CHAR(256));

+----------------+----------------+

| HEX(CHAR(1,0)) | HEX(CHAR(256)) |

+----------------+----------------+

| 0100           | 0100           |

+----------------+----------------+

mysql> SELECT HEX(CHAR(1,0,0)), HEX(CHAR(256*256));

+------------------+--------------------+

| HEX(CHAR(1,0,0)) | HEX(CHAR(256*256)) |

+------------------+--------------------+

| 010000           | 010000             |

+------------------+--------------------+

디폴트로는, CHAR()는 바이너리 스트링을 리턴한다. 주어진 문자 셋에 있는 스트링을 만들기 위해서는, USING 구문을 옵션으로 사용한다:

mysql> SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));

+---------------------+--------------------------------+

| CHARSET(CHAR(0x65)) | CHARSET(CHAR(0x65 USING utf8)) |

+---------------------+--------------------------------+

| binary              | utf8                          |

+---------------------+--------------------------------+

만일 USING을 사용하였는데도 그 결과 스트링이 주어진 문자 셋에 대해서 유효하지 않게 되면, 경고문이 나오게 된다. 또한, 만일 스트릭트(strict) SQL 모드를 활성화 한다면, CHAR() 의 결과 값은 NULL된다 .

MySQL 5.0.15 이전 버전에서는, CHAR()연결 문자 셋에 있는 스트링을 리턴하며 USING 구문은 사용할 수 없게 된다. 또한, 각각의 인수는 모듈로(modulo) 256으로 해석이 되기 때문에, CHAR(256) CHAR(256*256) 는 둘 다 CHAR(0)과 동일한 것이 된다.

스트링 str의 길이를 리턴한다. 다중 바이트 문자는 단일 문자로 계산(count) 된다. , 5개의 2 바이트 문자를 갖는 스트링에 대해서, LENGTH() 10을 리턴 하지만, CHAR_LENGTH()5를 리턴 한다 .

  • CHARACTER_LENGTH(str )

CHARACTER_LENGTH() CHAR_LENGTH()과 동일하다.

  • CONCAT(str1,str2,...)

인수를 연결한 결과로 나오는 스트링을 리턴한다. 한 개 또는 그 이상의 인수를 가질 수 있다. 만일 모든 인수가 바이너리 스트링이 아니라면, 그 결과는 바이너리가 아닌 스트링이 된다. 만일 인수에 바이너리 스트링이 포함되어 있다면, 그 결과는 바이너리 스트링이 된다. 숫자 인수는 동일한 바이너리 스트링 형태로 변환된다 ; 만일 이렇게 변환되는 것을 원하지 않을 경우에는, 아래의 예문과 같이 명확하게 타입 캐스트(type cast)를 사용하면 된다 :

SELECT CONCAT(CAST(int_col AS CHAR), char_col );

CONCAT() 모든 인수가 NULL이 아니면 NULL 을 리턴한다.

mysql> SELECT CONCAT('My', 'S', 'QL');

        -> 'MySQL'

mysql> SELECT CONCAT('My', NULL, 'QL');

        -> NULL

mysql> SELECT CONCAT(14.3);

        -> '14.3'

  • CONCAT_WS(separator,str1,str2,...)

CONCAT_WS() 구분자를 사용하는 연결(Concatenate With Separator)을 나타내는 것이며 CONCAT()의 특수 형태이다. 첫 번째 인수는 나머지 인수들에 대한 구분자(separator)가 된다. 구분자는 연결되는 스트링 사이에 추가된다. 구분자는 스트링이 될 수 있다. 만일 구분자가 NULL 이면, 그 결과는 NULL이다.

mysql> SELECT CONCAT_WS(',','First name','Second name','Last Name');

        -> 'First name,Second name,Last Name'

mysql> SELECT CONCAT_WS(',','First name',NULL,'Last Name');

        -> 'First name,Last Name'

CONCAT_WS()는 빈 스트링(empty string)을 무시(skip)하지 않는다. 하지만, 구분자 인수 다음에 나오는 모든 NULL 값은 무시를 한다.

  • CONV(N,from_base, to_base)

서로 다른 문자 베이스(base)간의 숫자를 변환한다. from_base 에서 베이스 to_base로 변환된 숫자 N의 스트링 표현식을 리턴한다. 인수 중의 하나가 NULL이면 NULL 을 리턴한다.인수 N 은 정수로 해석되지만, 정수 또는 스트링으로 지정될 수도 있다. 최소 베이스는 2 이고 최대 베이스는 36이다 . 만일 to_base 가 음수라면, N 은 부호화된 숫자로 간주된다. 그렇지 않을 경우에는, N 은 부호 없는 숫자로 취급된다. CONV() 64-비트 정밀도를 갖는다.

mysql> SELECT CONV('a',16,2);

        -> '1010'

mysql> SELECT CONV('6E',18,8);

        -> '172'

mysql> SELECT CONV(-17,10,-18);

        -> '-H'

mysql> SELECT CONV(10+'10'+'10'+0xa,10,10);

        -> '40'

  • ELT(N,str1, str2,str3,...)

만일N = 1이면, str1, N = 2이면, str2 을 리턴하는 방식. N 1 보다 작거나 또는인수의 숫자보다 많을 경우에는 NULL을 리턴한다. ELT()FIELD()의 보수(complement)이다 .

mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');

        -> 'ej'

mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');

        -> 'foo'

bits에 있는 모든 비트 셋(bit set) 대해서는, on 스트링을, 그리고 모든 리셋 비트에 대해서는, off 스트링을 리턴한다 . bits 에 있는 비트는 오른쪽에서 왼쪽으로 검사된다 (낮은 순서에서 높은 순서 비트로). 스트링은 왼쪽에서 오른쪽으로 결과에 추가되는데, separator 스트링으로 구분이 된다 (디폴트 스트링은 콤마 문자,’). 검사가 되는 비트의 숫자는 number_of_bits로 주어진다 (디폴트는 64).

mysql> SELECT EXPORT_SET(5,'Y','N',',',4);

        -> 'Y,N,Y,N'

mysql> SELECT EXPORT_SET(6,'1','0',',',10);

        -> '0,1,1,0,0,0,0,0,0,0'

  • FIELD(str,str1,str2,str3 ,...)

str1, str2, str3, ... 리스트에 있는 str 의 인덱스(포지션) 리턴한다. str찾을 수 없는 경우에는 0 을 리턴 한다.

만일 FIELD()에 대한 모든 인수가 스트링이라면, 모든 인수는 스트링으로 비교된다 . 만일 모든 인수가 숫자일 경우에는 숫자로 비교가 된다. 그렇지 않은 경우라면, 인수들은 두 번 (double) 비교가 된다.

만일 str NULL이라면, 리턴 값은 0 이 되는데, 그 이유는 NULL 은 어떤 값과도 등식 비교가 되지 않기 때문이다 . FIELD()ELT()의 보수(complement)이다.

mysql> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');

        -> 2

mysql> SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');

        -> 0

만일 스트링 str N 서브 스트링으로 구성된 스트링 리스트 strlist 에 있는 것이라면, 1의 범위에 있는 값을 N 리턴한다 . 하나의 스트링 리스트는 콤마 문자로 구분된 서브 스트링들로 구성된 스트링이다. 만일 첫 번째 인수가 상수 스트링이고 두 번째 인수가 타입 SET의 컬럼이라면, FIND_IN_SET() 함수는 비트 산술식을 사용하기 위해서 최적화가 된다. 만일 str strlist 없거나 또는 strlist가 빈 스트링이라면 , 0을 리턴한다. NULL if만일 인수 중의 하나가 NULL이라면, NULL을 리턴한다. 만일 첫 번째 인수가 콤마 문자를 가지고 있다면, 이 함수는 제대로 동작을 하지 않는다.

mysql> SELECT FIND_IN_SET('b','a,b,c,d');

        -> 2

  • FORMAT(X,D )

숫자 X 포맷을 '#,###,###.##' 형태로 만들고, D의 소수점 뒷자리에서 절사(round) 를 하고, 그 결과를 스트링으로 리턴한다. 만일 D 0 이면, 결과는 소수점 또는 분수 부분을 갖지 않는다.

mysql> SELECT FORMAT(12332.123456, 4);

        -> '12,332.1235'

mysql> SELECT FORMAT(12332.1,4);

        -> '12,332.1000'

mysql> SELECT FORMAT(12332.2,0);

        -> '12,332'

  • HEX(N_or_S)

만일N_or_S 이 숫자라면, N에 대한 16진수 값에 해당하는 스트링 표현을 리턴하는데 , 여기에서 N (BIGINT) 숫자가 된다. 이것은 CONV(N,10,16)과 동일하다.

만일 N_or_S 이 스트링 이라면 , N_or_S 에 대한 16진수 스트링 표현식을 리턴하는데, N_or_S 에 있는 각각의 문자는 2개의 16진수 숫자로 변환된다.

mysql> SELECT HEX(255);

        -> 'FF'

mysql> SELECT 0x616263;

        -> 'abc'

mysql> SELECT HEX('abc');

        -> 616263

  • INSERT(str,pos ,len,newstr)

str 포지션 pos 에서 시작하는 서브 스트링을 len 문자 길이만큼 스트링 newstr 변경시켜서 str 리턴한다. 만일 pos 가 스트링의 길이 안에 있지 않다면, 원래의 스트링을 리턴한다. 만일 len 의 범위가 스트링의 나머지 길이 범위 내에 있지 않다면, 포지션 pos  이후의 나머지 스트링을 대체 시킨다. 만일 어떤 인수가 NULL 이면 , NULL을 리턴한다.

mysql> SELECT INSERT('Quadratic', 3, 4, 'What');

        -> 'QuWhattic'

mysql> SELECT INSERT('Quadratic', -1, 4, 'What');

        -> 'Quadratic'

mysql> SELECT INSERT('Quadratic', 3, 100, 'What');

        -> 'QuWhat'

이 함수는 다중 바이트에서도 동작을 한다.

  • INSTR(str,substr)

str 에서 서브 스트링 substr 가 처음으로 나오는 포지션을 리턴한다. 이것은 LOCATE()에서 두 개의 인수를 사용하는 것과 동일한 결과를 리턴 하지만, 인수들의 순서는 반대가 된다.

mysql> SELECT INSTR('foobarbar', 'bar');

        -> 4

mysql> SELECT INSTR('xbar', 'foobar');

        -> 0

이 함수는 다중 바이트에서도 동작을 하며, 최소 하나의 인수가 바이너리 스트링일 경우에만 문자 크기를 구분한다.

  • LCASE(str)

LCASE()LOWER()와 동의어 이다.

  • LEFT(str,len)

스트링 str에서 가장 왼쪽으로부터 len 개의 문자를 리턴한다 .

mysql> SELECT LEFT('foobarbar', 5);

        -> 'fooba'

  • LENGTH(str)

str의 길이를 바이트 단위로 리턴한다. 다중 바이트 문자는 다중 바이트로 계산 (count) 된다. 이것은 2 바이트 문자가 5 개 있는 스트링의 경우, LENGTH() 10을 리턴하는 반면에, CHAR_LENGTH()5 리턴한다는 것을 의미한다.

mysql> SELECT LENGTH('text');

        -> 4

  • LOAD_FILE(file_name)

파일을 읽은 다음에 파일의 내용물을 스트링으로 리턴한다. 이 함수를 사용하기 위해서는, 파일은 반드시 서버 호스트에 있어야 하며, 그 파일에 대한 경로 이름을 전체적으로 지정해야 하며, 그리고 FILE 권한을 가져야 한다. 그 파일은 모든 사용자에게 읽힐 수 있어야 하며 파일의 크기는 max_allowed_packet 바이트 보다는 작아야 한다.

만일 파일이 존재하지 않거나 또는 위의 조건 중에 하나로 인해 파일을 읽을 수가 없게 된다면, 함수는 NULL을 리턴한다.

MySQL 5.0.19 이후 버전에서는, character_set_filesystem 시스템 변수가 리터럴 스트링으로 주어진 파일 이름에 대한 해석을 제어한다.

mysql> UPDATE t

            SET blob_col=LOAD_FILE('/tmp/picture')

            WHERE id=1;

  • LOCATE(substr,str), LOCATE(substr,str,pos)

첫 번째 신텍스는 str 에서 서브 스트링 substr 가 처음으로 나오는 포지션을 리턴한다 . 두 번째 신텍스는, 포지션 pos에서 시작을 해서, str 에서 서브 스트링 substr 가 처음으로 나오는 포지션을 리턴한다. substr str에 존재하지 않을 경우에는, 0을 리턴한다.

mysql> SELECT LOCATE('bar', 'foobarbar');

        -> 4

mysql> SELECT LOCATE('xbar', 'foobar');

        -> 0

mysql> SELECT LOCATE('bar', 'foobarbar', 5);

        -> 7

이 함수는 다중 바이트에서도 동작을 하며, 인수 중에서 최소 하나라도 바이너리 스트링일 경우에만 문자 크기를 구분한다.

  • LOWER(str)

현재 (current) 문자 셋 매핑에 따라서 스트링 str 의 모든 문자를 소문자로 변경 시켜서 리턴한다 . 디폴트는 latin1 (cp1252 West European).

mysql> SELECT LOWER('QUADRATICALLY');

        -> 'quadratically'

함수는 다중 바이트에서도 동작을 한다.

  • LPAD(str,len,padstr)

왼쪽에 스트링 padstr 를 집어 넣어서 문자의 길이를 len 만큼 되도록 한 스트링 str 을 리턴한다. 만일 str len 보다 길다면, 리턴 값은 len 길이 만큼 줄어 든다 .

mysql> SELECT LPAD('hi',4,'??');

        -> '??hi'

mysql> SELECT LPAD('hi',1,'??');

        -> 'h'

  • LTRIM(str)

스트링 앞에 있는 스페이스를 없앤 스트링 str 리턴한다 .

mysql> SELECT LTRIM('  barbar');

        -> 'barbar'

이 함수는 다중 바이트에서도 동작을 한다.

  • MAKE_SET(bits,str1 ,str2,...)

bits 셋에 대응되는 비트를 가지고 있는 스트링으로 구성된 셋 값 (콤마 문자로 구분된 서브 스트링을 가지고 있는 스트링)을 리턴한다. str1은 비트 0대응되고 , str2 1에 대응되며, 계속 이런 식으로 대응이 된다. str1, str2, ... 에 있는 NULL 값은 결과에 따라 나오지 않는다.

mysql> SELECT MAKE_SET(1,'a','b','c');

        -> 'a'

mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');

        -> 'hello,world'

mysql> SELECT MAKE_SET(1 | 4,'hello','nice',NULL,'world');

        -> 'hello'

mysql> SELECT MAKE_SET(0,'a','b','c');

        -> ''

  • MID(str, pos,len)

MID(str,pos,len) SUBSTRING(str,pos,len) 동의어 이다.

  • OCT(N)

N 8진 값에 해당하는 스트링 표현식을 리턴하는데, 여기에서 N (BIGINT) 번호가 된다. 이것은 CONV( N,10,8)과 같다. 만일 N NULL이면, NULL을 리턴한다.

mysql> SELECT OCT(12);

        -> '14'

OCTET_LENGTH()LENGTH()과 동의어 이다.

  • ORD(str)

만일 If the leftmost character of the string스트링 str 의 가장 왼쪽의 문자가 다중 바이트 문자라면, 그 문자에 대한 코드를 리턴하는데, 그 값은 아래의 공식을 사용해서 얻어낸다:

  (1st byte code)

+ (2nd byte code × 256)

+ (3rd byte code × 2562) ...

만일 가장 왼쪽의 문자가 다중 바이트 문자가 아니라면, ORD()ASCII() 함수와 같은 값을 리턴한다.

mysql> SELECT ORD('2');

        -> 50

  • POSITION(substr IN str)

POSITION(substr IN str )LOCATE(substr,str)과 동의어 이다.

 

  • QUOTE(str)

SQL 명령문에서 이스케이프된 데이터 값으로 사용할 수 있는 결과를 만들기 위해 스트링에 인용 부호를 준다. 만일 인수가 NULL이면 , 리턴 값은 인용 부호가 없는 단어 “NULL” 이 나오게 된다.

mysql> SELECT QUOTE('Don\'t!');

        -> 'Don\'t!'

mysql> SELECT QUOTE(NULL);

        -> NULL

  • REPEAT(str,count )

count 횟수 만큼 반복된 스트링 str 으로 구성된 스트링을 리턴한다. 만일 count 1 보다 작을 경우에는 , 빈 스트링을 리턴한다. str 또는 count NULL이라면, NULL을 리턴한다

mysql> SELECT REPEAT('MySQL', 3);

        -> 'MySQLMySQLMySQL'

  • REPLACE(str, from_str,to_str)

스트링 from_str 가 나온 부분을 모두 스트링 to_str로 대체해서 스트링 str 을 리턴한다.               REPLACE()from_str에 대한 검색을 할 때 문자 크기를 구분해서 매칭을 실행한다.

mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');

        -> 'WwWwWw.mysql.com'

이 함수는 다중 바이트에서도 동작을 한다 .

  • REVERSE(str )

문자의 순서를 역순으로 헤서 스트링 str 을 리턴한다.

mysql> SELECT REVERSE('abc');

        -> 'cba'

이 함수는 다중 바이트에서도 동작을 한다.

  • RIGHT(str, len)

str에서 오른쪽으로부터 len 문자 만큼을 리턴한다.

mysql> SELECT RIGHT('foobarbar', 4);

        -> 'rbar'

이 함수는 다중 바이트에서도 동작을 한다.

  • RPAD(str,len,padstr)

스트링 padstr 를 오른쪽에 집어 넣어서 len 문자 길이 만큼 str을 만들어서 리턴한다. 만일 str len 보다 길다면, 리턴 값은 len 문자 만큼 짧아진다.

mysql> SELECT RPAD('hi',5,'?');

        -> 'hi???'

mysql> SELECT RPAD('hi',1,'?');

        -> 'h'

이 함수는 다중 바이트에서도 동작을 한다.

  • RTRIM(str)

스트링 str에서 뒤에 붙어 있는 스페이스 문자를 없앤 스트링을 리턴한다.

mysql> SELECT RTRIM('barbar   ');

        -> 'barbar'

함수는 다중 바이트에서도 동작을 한다.

  • SOUNDEX(str)

Str의 사운덱스(soundex) 스트링을 리턴한다. 거의 같은 소리가 나는 두 개의 스트링은 고유의 사운덱스 스트링을 가져야 한다. 표준 사운덱스 스트링은 4 문자 길이가 되지만, SOUNDEX() 함수는 임의의 길이 스트링을 리턴한다. 여러분은 표준 사운덱스 스트링을 얻기 위해서 결과 값에 SUBSTRING()을 사용할 수가 있다. str에 있는 문자 중에 알파벳이 아닌 것들은 모두 무시가 된다 . A-Z 범위를 벗어나는 모든 국제 문자들은 모두 모음으로 취급된다 .

mysql> SELECT SOUNDEX('Hello');

        -> 'H400'

mysql> SELECT SOUNDEX('Quadratically');

        -> 'Q36324'

  • expr1 SOUNDS LIKE expr2

이것은 SOUNDEX(expr1) = SOUNDEX(expr2) 과 같다.

  • SPACE(N)

N 개의 스페이스 문자로 구성된 스트링을 리턴한다.

mysql> SELECT SPACE(6);

        -> '      '

  • SUBSTRING(str ,pos), SUBSTRING(str FROM pos), SUBSTRING(str,pos ,len), SUBSTRING(str FROM pos FOR len)

len 인수가 없는 형태는 포지션 pos에서 시작을 하는 서브 스트링을 스트링 str 에서 리턴 한다. len 인수를 가지고 있는 형태는 포지션 pos에서 시작을 해서 서브 스트링 len 문자를 리턴한다. FROM을 사용하는 형태는 표준 SQL 신텍스이다. pos의 값으로 음수를 사용하는 것도 가능하다. 음수를 사용할 경우에는, 서브 스트링의 시작점이 스트링의 처음이 아닌 끝에서부터 pos 문자 위치가 된다 . 음수 값은 이 함수의 어떤 형태에서도 사용이 가능하다.

mysql> SELECT SUBSTRING('Quadratically',5);

        -> 'ratically'

mysql> SELECT SUBSTRING('foobarbar' FROM 4);

        -> 'barbar'

mysql> SELECT SUBSTRING('Quadratically',5,6);

        -> 'ratica'       

mysql> SELECT SUBSTRING('Sakila', -3);

        -> 'ila'       

mysql> SELECT SUBSTRING('Sakila', -5, 3);

        -> 'aki'

mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);

        -> 'ki'

이 함수는 다중 바이트에서도 동작을 한다.

만일 len 1 보다 작으면, 그 결과는 빈 스트링이 된다.

SUBSTR()SUBSTRING() 동일하다.

구분자 (delimiter) delimcount 만큼 나오기 전에 스트링 str 에서 서브 스트링을 리턴한다. 만일 count 양수 (positive)라면, 마지막 구분자의 왼쪽에 있는 모든 것들이 리턴된다 (왼쪽부터 계산이 됨). 만일 count 가 음수일 경우에는, 마지막 구분자의 오른쪽에 있는 모든 것들이 리턴된다 (오른쪽부터 계산됨). SUBSTRING_INDEX()delim에 대한 검색을 할 때 문자의 크기를 구분한다 .

mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);

        -> 'www.mysql'

mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);

        -> 'mysql.com'

이 함수는 다중 바이트를 지원한다.

  • TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) , TRIM([remstr FROM] str)

스트링 str 를 모든 remstr 접두사 (prefixes) 또는 접미사를 제거한 상태로 리턴한다. 만일 BOTH, LEADING, 또는 TRAILING 중의 어느 것도 주어지지 않는다면, BOTH가 주어진 것으로 간주된다 . remstr 는 선택 사항이며, 만일 지정되지 않을 경우에는, 스페이스가 제거된다.

mysql> SELECT TRIM('  bar   ');

        -> 'bar'

mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');

        -> 'barxxx'

mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');

        -> 'bar'

mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');

        -> 'barx'

이 함수는 다중 바이트를 지원한다.

  • UCASE(str)

UCASE() UPPER()와 동의어이다.

  • UNHEX(str)

HEX(str)와는 반대 연산을 실행한다. , 이 함수는 인수에 있는 각각의 16진수를 숫자로 해석을 하고 그 숫자에 대응하는 문자로 변환을 시킨다. 그 결과로 나오는 문자들은 바이너리 스트링으로 리턴된다 .

mysql> SELECT UNHEX('4D7953514C');

        -> 'MySQL'

mysql> SELECT 0x4D7953514C;

        -> 'MySQL'

mysql> SELECT UNHEX(HEX('string'));

        -> 'string'

mysql> SELECT HEX(UNHEX('1267'));

        -> '1267'

  • UPPER( str)

Returns 스트링 str 를 현재의 (current) 문자 셋 매핑에 따라서 대문자로 변환이 된 모든 문자와 함께 리턴한다. 디폴트는 latin1 (cp1252 West European).

mysql> SELECT UPPER('Hej');

        -> 'HEJ'

이 함수는 다중 바이트를 지원한다.

2009/09/14 12:00 2009/09/14 12:00