아스키코드

 

ASCII는 ANSI의 전신이 ASA에서 개발했다

 
 데이터베이스에서 공백으로 추정되나 실제는 공백이 아닌 문자들 때문에 힘들어하는 개발자 분들이 많습니다.
특히 데이터가 많고, 업무가 바쁠 때는 정확한 원인을 파악하지 못하고 넘어가곤 합니다. 
 
이런 상황에서 도움이 되는 것은 ASCII 코드에 대한 이해입니다. 컴퓨터는 실제로 문자를 인식할 수 없기 때문에 모든 문자를 숫자로 매핑하는 방식인 ASCII 코드로 문자를 저장합니다. 아스키는 7비트 인코딩으로, 33개의 출력 불가능한 제어 문자들과 공백을 비롯한 95개의 출력 가능한 문자들로 총 128개로 구성되어있습니다.
 
 맨 아래 ASCII 코드 일람표를 보면 우리가 사용하는 "공백 문자 (10진수 32 / 16진수 20 / 문자 SPACE)" 외에도, 눈에 잘 보이지 않지만 특수한 역할을 하는 문자들이 포함되어 있습니다. 특히, 아래 문제에 "ASCII ( 10진수 10, 13 )  2개 문자"들은 공백처럼 보이지만, 실제로는 특수한 기능을 가지고 있어 데이터를 다룰 때 혼란을 줄 수 있습니다.
 


[ 문제 발생 ]
  이름 컬럼 데이터의 끝 부분에 SPACE 문자가 추가되어 있는 것을 확인하였습니다. 개발자는 TRIM으로 SPACE를 모두 제거하는 UPDATE문을 수행하였고, 데이터 클렌징이 잘 되었다고 판단했습니다. 하지만 실제 컬럼에는 LF, CR 문자까지 존재했습니다. 그로 인해 SQL WHERE 조건절에 = '이름' 처리 시,  입력한 이름의 데이터가 조회 되지 않은 문제를 겪었습니다. 

 
공백으로 보이지만, 공백이 아닌 것이 맨 아래 아스키 코드 일람 표내에 어떤 것일까? 
 
  1. Line Feed (LF, ASCII 10):
     -  줄을 바꾸는 역할로, 커서를 다음 줄로 이동
 
  2. Carriage Return (CR, ASCII 13):
    -  커서를 현재 줄의 맨 앞으로 이동시키는 기능
 
 Windows에서는 이 두 문자가 "개행 문자(줄 바꿈)"로 함께 사용되며, 보통 우리가 줄 바꿈을 하면 CR + LF로 처리됩니다.   Unix/Linux 시스템에서는 주로 LF(ASCII 10)만으로 개행 처리를 합니다.
이러한 문자가 Oracle 데이터베이스의 컬럼 값으로 저장가면 데이터가 실제로 공백처럼 보이지만, 실제로는 공백이 아니기 때문에, 데이터 처리 과정에서 문제를 야기 시킬 수 있습니다. 이를 인식하지 못한 상태에서 데이터를 다루면 예상치 못한 결과를 초래하므로 주의해야합니다. 
 
 


[ 문제 해결 방법 ]
  이런 보이지 않는 특수 문자를 찾기 위해 정규식을 활용한 쿼리를 사용할 수 있습니다.  예를 들어, ASCII 10 (LF) 또는        ASCII 13 (CR)을 포함한 데이터를 찾으려면 다음과 같은 쿼리를 사용할 수 있습니다:

 select col1 
   from table 
  where regexp_like ( col1, chr(10) || '|' || chr(13) );

개인 경험으로 위 SQL로, 특정 테이블 6 만건 데이터에서 12건의 품질이 낮은 데이터를 찾은 적이 있습니다.
 


[ 유사 예제 ]

WITH TB_REGEXP
 AS
   (
       SELECT 'Korea '||chr(13)||' Fighting 1' AS title FROM DUAL UNION ALL 
       SELECT 'Korea '||chr(10)||' Fighting 2' FROM DUAL 
 )
SELECT *
  FROM TB_REGEXP
 WHERE REGEXP_LIKE ( title ,chr(10)||'|'||chr(13),'i')

SQL 결과값 ( 데이터를 복사하여 편집창에 넣으면 위와 같이 개행 처리됨을 볼수 있다 )




[ 오라클 문자 <-> 아스키코드 변경 방법 ] 

 1. 문자(CHAR)를 아스키 코드(DEC)로 변경   

 select ascii('!') from dual;


 2. 아스키 코드(DEC)를 문자(CHAR)로 변경    

select chr(33) from dual;

 
 
 
[ 아스키 코드 일람 ]

ascii-tables.com