# 13강. 문자열 연산

**`문자열 연산`**
```
+ || CONCAT SUBSTRING TRIM CHARACTER_LENGTH
```

---

## 1. 문자열 결합
- 문자열 결합이란 다음과 같이 문자열 데이터를 결합하는 연산이다.

**`문자열 결합 사례`**
```
'ABC' || '1234' -> 'ABC1234'
```

- 문자열을 결합하는 연산자에는 데이터베이스 제품마다 방언이 있으며 다음과 같은 차이를 가진다.

|연산자/함수|연산|데이터베이스|
|-|-|-|
|+|문자열 결합|SQL Server|
|\|\||문자열 결합|Oracle, DB2, PostgreSQL|
|CONCAT|문자열 결합|MySQL|

- `SQL Server`는 문자열 결합에 `+` 연산자를 사용한다.
- `Oracle`이나 `DB2`, `PostgreSQL`에서는 `||` 연산자를 사용해서 문자열을 결합한다.
- `MySQL`에서는 `CONCAT` 함수로 문자열을 결합한다.

##### + 연산자, || 연산자, CONCAT 함수로 문자열을 결합할 수 있다!

- 문자열 결합은 `2개의 열 데이터를 모아서 1개의 열로 처리하고 싶은` 경우에 자주 사용한다.

```
SELECT CONCAT(quantity, unit) FROM sample35;
```

- `sample35`의 `unit` 열은 문자열형이고 `quantity` 열은 `INTEGER` 형의 열이다.
- 문자열 결합이지만 수치 데이터도 문제없이 연산할 수 있다.
- 단, 문자열로 결합한 결과는 문자열형이 된다.

---

## 2. SUBSTRING 함수
- `SUBSTRING` 함수는 문자열의 일부분을 계산해서 반환해주는 함수이다. 데이터베이스에 따라서는 함수명이 `SUBSTR`인 경우도 있다.

```
앞 4자리(년) 추출
SUBSTRING('20140125001', 1, 4) -> '2014'

5째 자리부터 2자리(월) 추출
SUBSTRING('20140125001', 5, 2) -> '01'
```

---

## 3. TRIM 함수
- `TRIM` 함수는 문자열의 앞뒤로 여분의 스페이스가 있을 때 이를 제거해주는 함수로 문자열 도중에 존재하는 스페이스는 제거되지 않는다.
- 고정길이 문자열형에 대해 많이 사용하는 함수이다.
- `CHAR` 형의 문자열형에서는 문자열의 길이가 고정되며 남은 공간은 스페이스로 채워진다.
- 이처럼 빈 공간을 채우기 위해 사용한 스페이스를 제거하는 데 `TRIM` 함수를 사용할 수 있다.
- 한편, 인수를 지정하는 것으로 스페이스 이외의 문자를 제거할 수도 있다.

**`TRIM으로 스페이스 제거하기`**
```
TRIM('ABC   ) -> 'ABC
```

---

## 4. CHARACTER_LENGTH 함수
- `CHARACTER_LENGTH` 함수는 문자열의 길이를 계산해 돌려주는 함수이다.
- `VARCHAR` 형의 문자열은 가변 길이이므로 길이가 서로 다르다.
- `CHARACTER_LENGTH` 함수를 사용하면 문자열의 길이를 계산할 수 있다.
- 문자열의 길이는 문자 단위로 계산되어 수치로 반환된다.
- 또한 함수형은 `CHARACTER_LENGTH`로 줄여서 사용할 수 있다.
- 한편 `OCTET_LENGTH` 함수는 문자열의 길이를 바이트 단위로 계산해 돌려주는 함수이다.
- 데이터 단위로 `바이트`라는 것이 있다. `SQL`의 `OCTET_LENGTH` 함수를 잘 사용하는 동시에 중요한 것은 문자 하나의 데이터가 몇 바이트의 저장공간을 필요로 하는지 `인코드 방식`에 따라 결정된다는 점이다.
- 문자를 수치화(인코드) 하는 방식에 따라 필요한 저장공간의 크기가 달라진다.
- `VARCHAR` 형의 최대 길이 역시 바이트 단위로 지정한다. 하지만 `문자세트`에 따라 길이가 문자 수로 간주되기도 하니 주의해야 한다.

### 문자세트(character set)
- 알파벳의 경우는 반각문자, 한글은 전각문자라고 할 수 있다.
- 반각문자는 전각문자 폭의 절반밖에 안 되며 저장용량 또한 전각문자 쪽이 더 크다.
- 반각의 알파벳이나 숫자, 기호는 `ASCII 문자`라고 불린다.
- 한글의 경우 `EUC-KR`, `UTF-8` 등의 인코드 방식을 주로 사용한다. 인코드 방식은 데이터베이스나 테이블을 정의할 때 변경할 수 있다.
- 이를 `RDBMS`에서는 `문자세트`라고 부른다.
- `한 문자가 몇 바이트인지는 쓰이는 문자세트에 따라 다르다`
- `CHAR_LENGTH` 함수를 사용하는 경우에는 아무런 문제가 되지 않는다. 한글이든 `ASCII` 문자든 문자 수로 계산되기 때문이다.
- 하지만 `OCTET_LENGTH` 함수의 경우는 문자 수가 아닌 바이트 단위로 길이를 계산하므로 주의해야 한다.

`표 3-4. 문자세트 별 문자 수와 바이트 수`
|문자세트|문자 수|바이트 수|
|-|-|-|
|EUC-KR|12|19
|UTF-8|12|26|

- `EUC-KR`에서 `ASCII` 문자는 1바이트, 한글은 2바이트의 용량을 가진다.
- 한편 `UTF-8`에서 `ASCII` 문자는 1아티으, 한글은 3바이트의 용량을 가진다.
- 즉, 문자세트에 따라 한 문자의 크기는 달라진다.
- 문자열 조작 함수로 문자 단위가 아닌 바이트 단위로 지정할 경우에는 문자세트에 주의해야 한다.

##### 문자열 데이터의 길이는 문자세트에 따라 다르다!

---