
【MySQL】改行コードを削除しながらSELECTする方法
改行コードが原因でCSV出力の行数が大幅増加!?
先日、お客様からMySQLの特定テーブルのレコード一覧をCSVまたはExcel形式で納品してほしいと依頼がありました。
そこで、以前ご紹介した「CSE」を利用し、1,000件ずつ抽出・CSV書き出しを行ったのですが、なぜか出力されたCSVファイルの行数が期待していた1,000件よりも大幅に多い1,200件になっていたのです。
原因を調査したところ、一部のレコードの特定のカラム内で意図しない「改行」が多数発生していることが判明しました。
「改行コード」がデータに含まれているために、CSVファイルとして出力する際に余分な行として認識されてしまっていたようです。
「これはまずい…」と思い、
と考え、試行錯誤した結果、無事に改行コードを除去したクリーンなデータを作成することができました。
今回は、このMySQLのSELECT時にレコード内の改行コードを効率的に削除する方法について、備忘録として詳しく解説したいと思います。
SQLで改行コードをスッキリ削除!CSV出力時のトラブル解決法
解決策:MySQLのREPLACE関数で改行コードを置換・削除
MySQLでレコードをSELECTする際に、特定のカラムに含まれる改行コードを削除するには、標準SQLのREPLACE関数を活用します。
REPLACE関数は、指定した文字列を別の文字列に置換する非常に便利な関数です。
今回のケースでは、抽出したいカラム(例:nameカラム)に対してREPLACE関数を二重に適用し、
一般的な改行コードである「CR(キャリッジリターン)」と「LF(ラインフィード)」をそれぞれ空文字("")に置換することで、改行コードを削除します。
1 2 3 4 5 6 7 |
SELECT id, REPLACE(REPLACE(name, CHAR(13), ''), CHAR(10), '') AS clean_name FROM hoge_tables WHERE delete_flg = 0; |
上記のSQLクエリでは、hoge_tablesテーブルからidカラムと、改行コードが削除されたnameカラム(clean_nameというエイリアスを付与)を抽出しています。
WHERE句でdelete_flgが0のレコードのみを対象としている点は、元のクエリから変更していません。
改行コード「CHAR(13)」と「CHAR(10)」の詳細
REPLACE関数内で使用しているCHAR(13)とCHAR(10)は、MySQLのCHAR関数でASCIIコードの10進数に対応する文字を表しています。
- CHAR(13) : CR(キャリッジリターン)
- CHAR(10) : LF(ラインフィード)
異なるオペレーティングシステムやテキストエディタでは、改行コードの扱いが異なる場合があります。
一般的には、CRとLFの組み合わせ(CRLF)や、LFのみが改行コードとして使用されます。
そのため、両方のコードを置換しておくことで、より確実に改行を削除することができます。
補足:タブコードの削除方法
ちなみに、もしレコード内に「タブ記号(\t)」が含まれており、これも削除したい場合は、同様にREPLACE関数とCHAR(9)を組み合わせて使用します。
- CHAR(9) : \t(タブ)
1 2 3 4 5 6 7 |
SELECT id, REPLACE(REPLACE(REPLACE(name, CHAR(13), ''), CHAR(10), ''), CHAR(9), '') AS clean_name_with_tab FROM hoge_tables WHERE delete_flg = 0; |
この方法を活用すれば、MySQLからデータを抽出する際に、レコード内の不要な改行コードやタブコードを簡単に削除し、よりクリーンなデータとして利用することができます。
CSV出力時の行数問題もこれで解決できるはずです。ぜひ参考にしてみてください。