MySQLのエンコードを一時的に指定してデータを表示(取得・SELECT)する
MySQLにデフォルトエンコード以外のエンコードでデータを格納し、
そのデータをSELECTで取得して表示する場合にも、エンコードに気を払う必要があります。
その点をスルーしてしまうと、いつまでたっても文字化けが解消されないと悩むことになります。
実際には正しく指定したエンコードでデータが格納されているにも関わらず。。。
MySQLのエンコードを一時的に指定してデータを表示(取得・SELECT)する
今までは、データベースのデフォルトエンコードと異なるデータを、
データベースに突っ込むなんていう面倒には出逢わなかったので、
気にしたこともなかったのですが、
どうしてもデフォルトエンコードと異なるデータを投入する必要が出た場合、
INSERT、及びSELECT双方でしっかりエンコードを意識して処理する必要があります(当然)
以下で紹介したデータを投入したデータベースから、
データを取得して表示する場合の例についてご紹介します。
その前に、どうせならデフォルトエンコードを変更すればいいじゃないかという話もあるかもしれません。
UTF-8からutfmb4の変換ならたぶんやっちゃって問題はないんだと思います。
でも、レンタルサーバーだとそういう選択が出来なかったりもする訳で悩ましい限り。
ちなみに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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
public function test_sc($jpn, $dirarr, $enc){ $enc_sql = "set character_set_results = {$enc}; "; $sql =<<<sql SELECT corporateNumber, name, prefectureName FROM tablename_{$enc} WHERE corporateNumber IN ('2430003004903','3430002040007','3450001000430','4430002014694','5430003000354','5460005000135', '6430003000221','6460301004367','7430002034104','7430002062591','7460301002106','8430001004016','9430005000316','9460002001586','9460105001590'); sql; $db = 'db'; $host = 'host'; $user = 'user'; $pass = 'pass'; $con = new mysqli($host, $user, $pass, $db); $con->query($enc_sql); //出力エンコードの指定 $msql_result = $con->query($sql); if( $msql_result === false ){ $res = "SQLの実行に失敗しました"; }else{ if($msql_result->num_rows > 0){ while ($row = $msql_result->fetch_assoc()) { if($enc != "utf8mb4"){ $corporateNumber = mb_convert_encoding( $row["corporateNumber"], "utf8", $enc) ; $name = mb_convert_encoding( $row["name"], "utf8", $enc) ; $prefectureName = mb_convert_encoding( $row["prefectureName"], "utf8", $enc) ; }else{ $corporateNumber = $row["corporateNumber"] ; $name = $row["name"]; $prefectureName = $row["prefectureName"]; } $link_tag = "<a href='https://www.houjin-bangou.nta.go.jp/henkorireki-johoto.html?selHouzinNo={$corporateNumber}' title='法人番号「{$corporateNumber}」を「国税庁法人番号公表サイト」で見る' target='_blank'>{$corporateNumber}</a>"; $tb .=<<<tb <tr><td>{$link_tag}</td><td style='font-size:2em;'>{$name}</td><td>{$prefectureName}</td></tr> tb; } $th =<<<th <p>エンコード:{$enc} にて格納したテーブルからのデータを表示しています。</p> <table class="footable ip_global" data-filter="#filter" data-page-size="256" data-page-previous-text="前へ" data-page-next-text="次へ"> <thead> <tr> <th>法人コード</th> <th>法人名</th> <th>都道府県名</th> </tr> </thead> <tbody> th; $tf =<<<tf </tbody> </table> tf; $res = $th. $tb. $tf; }else{ $res = 'データなし'; } } return $res; } } |
3行目で結果を取得するエンコードを決定し、15行目で以下のSQLを発行しています。
set character_set_results = utfmb4;
変数にしているのは、別途「sjis」「cp932」としてデータベースからエンコードを指定して、
データを受け取る場合がある為です。
それぞれ、以下のようになります。
set character_set_results = sjis;
set character_set_results = cp932;
MySQLからは格納されているエンコードのまま結果を受け取り、
今回はPHP側でエンコードを変換して、表示を行うという処理です。
24,25,26行目の部分がPHPでエンコードを変更している部分です。
sjis
、cp932
は、UTF-8にエンコードを変換しますが、
utfmb4
はそのままUTF-8として表示しています。
これは4byte表現が必要なUnicode文字がMySQL側の仕様で格納ができないだけで、
Web表示的にはUTF-8として正常に表示ができる為です。
実際の表示は以下でご確認いただけます。
尚、今回利用しているデータ、構造は以下で利用したもので検証しています。
格納されるテーブル側も目的のエンコードに合せたテーブル構造としています。
参考
データベースにsjis
、cp932
にてデータが格納されている場合に、
MySQLWorkBench(クライアントデフォルト:UTF-8)でデータを取得すると、
エンコードを意識することなく、データの参照は可能でした。
しかし、utfmb4
でデータが格納されている場合に、
同じようにMySQLWorkBench(クライアントデフォルト:UTF-8)でデータを取得すると、
4byte表現の必要がある外字は「?」として表示されてしまいました。
この場合、SELECTを発行する前に、
set character_set_results = utfmb4;
と指定してデータを取得すれば、
「?」の文字化けは解消することができます。
もし、文字化けが発生してしまって困る場合には、
まずデータベースの格納されているエンコードに合せてデータを取得して表示してみると、
問題の解決に繋がるかもしれません。
尚、デフォルトエンコードの確認は以下手順で行えます。
本サイトで公開しているツールについては、
十分にテストは行っておりますが個人で作成している為、
潜在的なバグがないとは言い切れません。
その為、ツールを用いた結果については十分検証の上ご利用ください。
当サイトおよび、管理人は如何なる損害もその責を負いません。
当サイト内のコンテンツおよび画像において、
出典・引用の外部著作権者の明記がないものは、
すべて管理人による著作物です。
当サイトでご紹介しておりますコンテンツの著作権の放棄は致しません。
サイト内コンテンツを引用される際にはご連絡は不要です。
ただし、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
公開日:
最終更新日:2019/06/20