MySQLのエンコードを一時的に指定してデータを格納(登録・INSERT)する
MySQLに対してデフォルトエンコードとは異なるデータを格納する場合、
そのデータに合ったエンコードを一時的に指定し、データを格納することで、
文字化けなど無用な悩みを避けてデータを利用することができ安心です。
ここでは一時的にMySQLのエンコードを変更する手順をご紹介します。
MySQLのエンコードを一時的に指定してデータを格納(登録・INSERT)する
ローカル環境など自分の権限でどうにでも変更ができる場合は、
そもそものデフォルトエンコードを変更してしまうのも一つの選択です。
しかしレンタルサーバー上のデータベースでは、
デフォルトエンコードが変更はできても、選択肢が限られていたり、
既に動いているCMSなどの影響を考えれば、変更したくない場合もあります。
そんな時に、特定のテーブルデータや今回の処理だけ、
エンコードを変更したデータを投入するような場合には一時変更が便利です。
ちなみにXSERVERであればMySQLデータベース作成時にエンコードが選択できます。
MySQL文字コード | EUC-JP/UTF-8/Shift-JIS/Binary から選択可 |
---|
これはデータベースのデフォルトエンコードを、
「utfmb4」や「cp932」にする事はできないという事です。
必要があれば、個別に対処する必要が発生します。
これは以下でご紹介したPHPの実行時に利用したものですが、
サンプルソースを貼っておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<?php $db = 'db'; $host = 'host'; $user = 'user'; $pass = 'pass'; $dir = "/dev/ntagojp_unicode/"; //csvをアップロードしたディレクトリ $con = new mysqli($host, $user, $pass, $db); $enc = 'utf8mb4'; //sjis, cp932などエンコードを指定 $con->query(" set character_set_connection = {$enc};"); $con->query(" set character_set_server = {$enc};"); $con->query(" set character_set_database = {$enc};"); $con->query(" set character_set_client = {$enc};"); $con->query(" set character_set_results = {$enc};"); $data_date = date("Ymd"); $data_date = "20180629"; //適宜上書きで日付指定 $pref = array( 0 => array('01', "hokkaido")); //47都道府県+海外データを適宜指定 $filename = "{$pref[0][0]}_{$pref[0][1]}_all_{$data_date}.csv"; //ヒアドキュメント構文は無用な\nが挿入されここでは使用しない。 $sql = " load data LOCAL infile '{$_SERVER['DOCUMENT_ROOT']}{$dir}{$filename}' into table gov_nta_corpnum_{$enc} FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '' "; $sql .= " LINES STARTING BY '' TERMINATED BY ". "'\\n'" . " IGNORE 0 LINES "; $sql .= " (sequenceNumber, corporateNumber, process, correct, updateDate, changeDate, name, nameImageId, kind, prefectureName,cityName, streetNumber, addressImageId, prefectureCode, cityCode, postCode, addressOutside, addressOutsideImageId,closeDate, closeCause, successorCorporateNumber, changeCause, assignmentDate, latest, enName, enPrefectureName, enCityName, enAddressOutside, furigana);"; $msql_result = $con->query($sql); if( $msql_result === false ){ $msg = "SQLの実行に失敗しました"; }else{ $msg = "インポート終了"; } $cnt_sql = "SELECT prefectureName, count(prefectureCode) FROM gov_nta_corpnum_utf8mb4 GROUP BY prefectureCode;"; $cntresult = $con->query($cnt_sql); if($cntresult->num_rows > 0){ while ($row = $cntresult->fetch_assoc()) { $arr[] = $row; } }else{ $arr = false; } echo $msg . '<br/>' .print_r($arr, true ) . '<br/><code>' . $sql . '</code>' ; |
11,12,13,15,16行目で発行しているSQL部分が、
一時的にエンコードの変更を行っている部分です。
実際には、以下のようにエンコードが指定されてSQLが発行されます。
set character_set_connection = utfmb4;
set character_set_server = utfmb4;
set character_set_database = utfmb4;
set character_set_client = utfmb4;
set character_set_results = utfmb4;
この環境ではデフォルトエンコードがUTF-8なのですが、
一時的に特定のテーブルに投入するデータに、
Unicodeの外字(4byte)文字を含むものを格納する必要があり変更しています。
変数にしているのは、その他「Shift-JIS」「cp932」のエンコードでも、
同様に実験を行っている為です。
このように、利用するデータに合せてエンコードを統一してから、
データの取り込みを行う事で、目的にあったデータの格納ができるようになります。
尚、この変更は、現在のMySQL接続を切ると無効になりますので、
都度、指定する必要があります。
また格納されるテーブル側も目的のエンコードに合せたテーブル構造としています。
格納したデータを実際に表示している例は以下でご確認いただけます。
尚、デフォルトエンコードの確認は以下手順で行えます。
本サイトで公開しているツールについては、
十分にテストは行っておりますが個人で作成している為、
潜在的なバグがないとは言い切れません。
その為、ツールを用いた結果については十分検証の上ご利用ください。
当サイトおよび、管理人は如何なる損害もその責を負いません。
当サイト内のコンテンツおよび画像において、
出典・引用の外部著作権者の明記がないものは、
すべて管理人による著作物です。
当サイトでご紹介しておりますコンテンツの著作権の放棄は致しません。
サイト内コンテンツを引用される際にはご連絡は不要です。
ただし、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
公開日:
最終更新日:2019/06/20