文字列をバイト数で切り取る
MySQLで文字列から一部切り取るとき
LEFT/RIGHT/MID もしくは SUBSTRING を使いますが、
これらの関数は、切り取る単位がバイトではなく文字単位になるため、
バイトで切る取ることはでません。
CASTを使ってバイナリに変換してSUBSTRINGをすれば、
バイト数で切り取ることができますが、
日本語等のマルチバイト文字が含まれていると
マルチバイトの途中で切り取られるため、文字化けが発生します
こういう時は、CONVERT関数を使います。
BINARY型からCHAR型に変換させます。LEFT/RIGHT/MID もしくは SUBSTRING を使いますが、
これらの関数は、切り取る単位がバイトではなく文字単位になるため、
バイトで切る取ることはでません。
CASTを使ってバイナリに変換してSUBSTRINGをすれば、
バイト数で切り取ることができますが、
日本語等のマルチバイト文字が含まれていると
マルチバイトの途中で切り取られるため、文字化けが発生します
mysql> select CAST(LEFT(CAST(name as BINARY), 10) as char(1000)) as name from animal; +---------+ | name | +---------+ | 犬ドッ 笨 +---------+
こういう時は、CONVERT関数を使います。
CONVERT関数でBINARYからCHARに変換
CASTで変換するのではなく、CONVERTで、mysql> select CONVERT(LEFT(CAST(name as BINARY), 10) USING utf8) as name from animal; +----------+ | name | +----------+ | 犬ドッ | +----------+
LFETを使わず、CONVERTでBINARYの最大バイト数を決めて変換し、
再度CONVERTで変換しても同じ結果になります。
mysql> select CONVERT(CONVERT(name BINARY(10) USING utf8) as name from animal; +----------+ | name | +----------+ | 犬ドッ | +----------+
0 件のコメント:
コメントを投稿