和集合

2表の和集合を取るSQLでちょっと苦労した。
UNION句を使って記述するのだが、文字コードでエラーが発生。
DBの文字コードはUTF8に設定してある。
具体的には

A表
ID, DATE, TITLE, TEXT
B表
ID, DATE, TEXT

という表の和集合を取って

C表
ID, DATE, TITLE, TEXT

を作ろうとした。
B表にはTITLEがないのでC表では空のセルができることになる。

最初SQLはこんな感じで書いた。

1: select ID, DATE, TITLE, TEXT
2: from A
3: union all
4: select ID, DATE, '' TITLE, TEXT
5: from B

そうすると、「UTF8とLatin1を結合することはできません」といった旨のエラーがでてしまう。
原因は、4行目の''の部分で、ここが文字コードLatin1と認識されていた。
(もしかするとDBの設定が正しければこのような問題は発生しないのかもしれないが・・)

対処方法は、''をUTF8に変換してあげれば良い。

1: select ID, DATE, TITLE, TEXT
2: from A
3: union all
4: select ID, DATE, _utf8('') TITLE, TEXT
5: from B

_utf8, _latin1 などのように、_のあとに文字コード名の関数で、その文字コードへのコード変換ができる。
ちなみに文字コードを調べる関数は、charset(xx)。