SQLのconvertについてまとめています。
convertは、SQLでデータ型の変換をおこなう関数です。EUCやUTF8の変換などキャラクターセットの変更が可能です。
SQLのconvertの構文
convertは、値のデータ型を変換する関数です。データベースにより、使い方に差異があります。
例えば、MySQLの場合は、以下の書式で文字列をutf8のキャラクターセットに変換可能です。
mysql> select convert( 'abc' using utf8 ); +-----------------------------+ | convert( 'abc' using utf8 ) | +-----------------------------+ | abc | +-----------------------------+ 1 row in set, 1 warning (0.00 sec)
関連)MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.10 キャスト関数と演算子
convert関数を使ってユーザ変数に代入することで、キャラクタセットを指定することが可能です。
/* ユーザ変数@aにabcを代入 */ mysql> set @a='abc'; Query OK, 0 rows affected (0.00 sec) /* @aのキャラクタセットがlatin1 */であることを確認 mysql> select charset(@a); +-------------+ | charset(@a) | +-------------+ | latin1 | +-------------+ 1 row in set (0.00 sec) /* convertを使って、utf8に変換した文字列を@aに代入 */ mysql> set @a=convert('abc' using utf8); Query OK, 0 rows affected, 1 warning (0.00 sec) /* @aのキャラクタセットが、utf8になっている */ mysql> select charset(@a); +-------------+ | charset(@a) | +-------------+ | utf8 | +-------------+ 1 row in set (0.00 sec)
データ型によっては、暗黙に自動変換されるケースがあります。例えば、以下のように整数型の値をconvert関数でchar型に変更することは可能ですが、整数型とchar型は暗黙に自動変換されるのでconvert関数自体が不要となります。
mysql> select convert(1, char(10)), convert(2,char(10)); +----------------------+---------------------+ | convert(1, char(10)) | convert(2,char(10)) | +----------------------+---------------------+ | 1 | 2 | +----------------------+---------------------+ 1 row in set (0.00 sec) mysql> select concat(convert(1, char(10)), convert(2,char(10))); +---------------------------------------------------+ | concat(convert(1, char(10)), convert(2,char(10))) | +---------------------------------------------------+ | 12 | +---------------------------------------------------+ 1 row in set (0.00 sec) /* convertを使用しなくても同じ結果になる */ mysql> select concat(1,2); +-------------+ | concat(1,2) | +-------------+ | 12 | +-------------+ 1 row in set (0.00 sec)
同様に、char型の’1’と’3’は、convert関数を使わなくても、整数型に自動変換されます。
mysql> select convert('1',signed)+convert('3',signed); +-----------------------------------------+ | convert('1',signed)+convert('3',signed) | +-----------------------------------------+ | 4 | +-----------------------------------------+ 1 row in set (0.02 sec) mysql> select '1'+'3'; +---------+ | '1'+'3' | +---------+ | 4 | +---------+ 1 row in set (0.01 sec)
-10をunsigned(符号なし)、sigined(符号あり)に変換すると、それぞれ以下のようになります。
mysql> select convert( '-10', unsigned); +---------------------------+ | convert( '-10', unsigned) | +---------------------------+ | 18446744073709551606 | +---------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> select convert( '-10', signed); +-------------------------+ | convert( '-10', signed) | +-------------------------+ | -10 | +-------------------------+ 1 row in set (0.00 sec)
‘1’をバイナリ型に変換すると、以下のようになります。
mysql> select convert( '1', binary); +----------------------------------------------+ | convert( '1', binary) | +----------------------------------------------+ | 0x31 | +----------------------------------------------+ 1 row in set (0.00 sec)
文字列をdatetime型に変換すると、以下のようになります。
mysql> select convert( '200320121500', datetime); +------------------------------------+ | convert( '200320121500', datetime) | +------------------------------------+ | 2020-03-20 12:15:00 | +------------------------------------+ 1 row in set (0.00 sec)
Oracleのconvertは、現行リリースでは推奨されない
Oracleでは、convertファンクションは「文字列を別のキャラクタセットに変換する」関数です。公式サイトによると、Oracleの現行のリリースでは、convertファンクションを使用しないことが推奨されています。
例えば、以下はLatin-1文字列を、ASCIIのキャラクタセットに変換するSQLです。
SELECT CONVERT('Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1') FROM DUAL; CONVERT('ÄÊÍÕØABCDE' --------------------- A E I ? ? A B C D E ?
SQL Serverのconvertの暗黙・明示変換表
SQL Serverのconvert関数は、値の型変換をおこないます。
出典)CAST および CONVERT (Transact-SQL) – SQL Server | Microsoft Docs
上記マトリックスの、青い四角系の箇所は、convert関数を使った明示的な変換が必要になります。オレンジの丸の箇所は、特に変換処理が不要で暗黙に自動変換されます。
PostgreSQLのconvertは、変換方法の定義が可能
PostgreSQLでは、以下の指定で型の変換が可能です。
convert('PostgreSQL' using iso_8859_1_to_utf_8)
なお、usingを使った変換は、事前に変換方法をcreate convertで定義しておく必要があります。下記の指定方法は、変換対象と変換後のキャラクターセットを指定できます。
select convert( 'text_in_unicode', 'UNICODE', 'LATIN1'); convert ---------------------------------- \x746578745f696e5f756e69636f6465 (1 row)
まとめ
- convert関数は、値の型を変換する関数。キャラクタセットの変換も可能。
- Oracleのconvert関数の利用は推奨されていない。
- PostgreSQLでは、convertの方式を事前に定義可能。