バイト数を取得する
SQLでバイト数を取得する関数は、次のようにDBMSによって使うものが異なります。
DBMS | 関数 |
---|---|
MySQL | LENGTH関数 |
OCTET_LENGTH関数 | |
PostgreSQL | OCTET_LENGTH関数 |
Oracle | LENGTHB関数 |
Access | LENB関数 |
SQLServer | なし |
それぞれの使い方を見ていきましょう。
LENGTH関数
LENGTH関数は、引数に指定された文字列の長さをバイト単位で取得する関数です。
MySQLで使用できます。
記述方法は次のようになります。
SELECT LENGTH(文字列);
使い方は上記のように非常にシンプルです。
文字列の長さをバイト単位で返します。
また、マルチバイト文字の場合は複数バイトとして取得されます。
では実際に確認してみましょう。
次のように記述します。
mysql> SELECT LENGTH('potepanstyle'); +------------------------+ | LENGTH('potepanstyle') | +------------------------+ | 12 | +------------------------+ 1 row in set (0.00 sec)
上記のようにバイト数が取得できました。
マルチバイトの場合は次のようになります。
mysql> SELECT LENGTH('ポテパンスタイル'); +------------------------------------+ | LENGTH('ポテパンスタイル') | +------------------------------------+ | 24 | +------------------------------------+ 1 row in set (0.00 sec)
OCTET_LENGTH関数
OCTET_LENGTH関数もLENGTH関数と同様に、引数に指定された文字列の長さをバイト単位で取得する関数です。
MySQL と PostgreSQLで使用できます。
記述方法は次のようになります。
SELECT OCTET_LENGTH(文字列);
先ほど同様に、実際に動かして確認してみます。
mysql> SELECT OCTET_LENGTH('potepanstyle'); +------------------------------+ | OCTET_LENGTH('potepanstyle') | +------------------------------+ | 12 | +------------------------------+ 1 row in set (0.00 sec) mysql> SELECT OCTET_LENGTH('ポテパンスタイル'); +------------------------------------------+ | OCTET_LENGTH('ポテパンスタイル') | +------------------------------------------+ | 24 | +------------------------------------------+ 1 row in set (0.00 sec)
このように、バイト数が取得できました。
LENGTHB関数
LENGTHB関数も、引数に指定された文字列の長さをバイト単位で取得する関数です。
Oracleデータベースで使用できます。
記述方法は次の通りです。
SELECT LENGTHB(文字列);
執筆者がOracleデータベースを使用していないため実行結果は省略しますが、LENGTH関数やOCTET_LENGTH関数と同じ結果が得られます。
LENB関数
LENB関数も、引数に指定された文字列の長さをバイト単位で取得する関数です。
Accessで使用できます。
記述方法は次の通りです。
SELECT LENB(文字列);
執筆者がAccessを使用していないためOracleデータベース同様、実行結果は省略します。
バイト数を指定して取得する
バイト数を指定して取得する関数には、次のようなものがあります。
- MidB関数(Access)
- SUBSTRB関数(Oracle)
「MySQLやPostgreSQLではバイト数を指定することはできないの?」と思うかもしれません。
確かに専用の関数はありませんが、関数を組み合わせることでバイト数で取得することができます。
サンプルで確認してみましょう。
mysql> SELECT CONVERT(LEFT(CAST('potepanstyle' as BINARY), 7) USING utf8); +-------------------------------------------------------------+ | CONVERT(LEFT(CAST('potepanstyle' as BINARY), 7) USING utf8) | +-------------------------------------------------------------+ | potepan | +-------------------------------------------------------------+ 1 row in set, 1 warning (0.00 sec)
上記のSQL文を少し見ていきます。
CAST('potepanstyle' as BINARY)
CAST文で「potepanstyle」をBINARY型に型変換しています。
LEFT(CAST('potepanstyle' as BINARY), 7)
次に、LEFT文で型変換した「potepanstyle」を左から7バイト分取得します。
CONVERT(LEFT(CAST('potepanstyle' as BINARY), 7) USING utf8)
最後にCONVERT文で、7バイトの「potepan」をUTF8に変換しました。
これで「potepan」という文字列として取得可能です。
これらの処理に使用した「CAST」「LEFT」「CONVERT」の使い方は次の記事で解説しています。
【関連記事】
▶︎SQL castはデータ型の明示的な変換 データベースによって、オプションに差異あり
▶︎【SQL】RIGHT関数とLEFT関数の詳細と移植の際の注意点について
▶︎SQL convertは、値の型変換をおこなう 文字列のキャラクターセット変更が可能
バイト数を変更する方法
カラムの文字数、バイト数を変更するには「ALTER TABLE MODIFY文」を使いましょう。
記述方法は次の通りです。
ALTER TABLE テーブル名 MODIFY カラム名 カラム定義;
変更したいテーブル名、カラム名を指定し、定義を変更すればOKです。
mysql> SHOW COLUMNS FROM user_list; +---------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+----------------+ | user_id | int | NO | PRI | NULL | auto_increment | | name | varchar(30) | YES | | NULL | | | age | int | YES | | NULL | | +---------+-------------+------+-----+---------+----------------+ 3 rows in set (0.07 sec)
上記のように、カラムの定義・バイト数が変更できました。
まとめ
SQLのバイト数について解説しました。
DBMSごとに使う関数が異なりますが、基本的な使い方は同様です。
バイト数で取得したい場合はぜひこの記事を参考にしてみてください。