/// BANGBOO BLOG ///

  • 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

March 9, 2010

MySQL chara issue

■結局どう設藹??する?
作成時:CREATE DATABASE aaa DEFAULT CHARACTER SET utf8mb4 COLLATE utf8_general_ci;
アプリ・??SET NAMES utf8mb4; あるい縺? mysql_set_charset('utf8mb4');

DB作成時とアプリ使用時縺?utf8かutf8mb4で最菴?限統臀??する

utf8mb4とは文字コードの臀??種で、UTF8縺?4バイト文字を扱う事が出来るも縺?
絵文字や中国漢字、日本鐔??でも特觸??漢藹??など縺?4バイトが含まれている
MySQLで縺?5.5からこ縺?utf8mb4に対応している
utfmb3縺?3バイト、MySQLは・??バイトは非推螂?

照合順蠎? 縺? utf8_general_ci >新バージョンで藹??繧?っているので鐔??確鐔??
 _ci 縺?case insensitive、_cs 縺? case sensitive、_bin はバイナ繝?
 _ci がパフォーマンスがいい、

SET NAMES より mysql_set_charsetがverによってはいい、またPDOが推奨されているが
https://techracho.bpsinc.jp/baba/2010_02_17/1133
https://www.php.net/manual/ja/function.mysql-set-charset.php

絵文字で臀??手縺?いかないと鐔??が途切れる等があるらしい、utf8が良い?
作成時:CREATE DATABASE aaa DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
アプリ・??SET NAMES utf8; あるい縺? mysql_set_charset('utf8');

-----------------------------------------

■DBのバックアップ(MySQLのダンプ)
バージョンでコマンドが違う場合がある、古いやつの場合↓

DB設藹??の文字コード、DBの運用文字コード、サーバOSの文字コード、SQLクライアントの文字コードの間で自動変觸??が觸??かり面倒
http://kgbu.hateblo.jp/entry/20081226/1230259302

バイナリでダンプし、バイナリでインポートすると問題はない
しかしバイナリのバイトシーケンスが付荳?されるので觸??持ち悪い
Blobのような特觸??なカラムがな縺?文字コードが統臀??されていればそれでやりたい(utf8)
https://ngyuki.hatenablog.com/entry/2018/06/21/220624

cp932: MS win/IBM/NEC98縺?SJIS、各社独自に拡張している、ほ縺?Win逕?

mysqldump -Q --host=192.168.1.2 --user=oreore --password=**** --default-character-set=binary name_db >$DBDUMP_FILE

-Q縺?quickオプション、通常はダンプ時に臀??気にテーブルデータをメモリへバッファしますがq指定縺?1行ごとに処理し大きなテーブルに有逕?
オプションは繝?イフ繝?2つはフル表記縺?=で値を付荳?、繝?イフン臀??つで短縮形でスペースを付けた上で値を付荳?
 --host=host_name -h host_name

???mysqldump-4.0が通らない、mysqldumpバイナ繝?/utf8オプションも使えない
Putty(SSH)等で入り sh db_backup.sh で藹??行しエラーを見る、無藹??觸??だと出せるが文字コードが混合している
 ps -aux あるい縺? ps aux でプロセスを見て、駄目なら殺す kill [pid]
phpmyadminで手動でエクスポート(無藹??觸??)で全テーブルを出し譁?DBにのせかえるしか
 →それまでは念のため通蟶?Backupに加えて手動で時々保存すれ
 →MySQLadmin>エクスポート>テーブル選択(同じ文字コードのもの・??>実行

ps -aux
kill pid

#!/bin/sh
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin

KEEPDAY=25
TODAY=`date +'%y%m%d'`
DBDUMP_FILE1=mysql.$TODAY
DBDUMP_FILE2=mysql_utf8.$TODAY
RMFILE1=mysql.`date -v -"$KEEPDAY"d +%y%m%d`.gz
RMFILE2=mysql_utf8.`date -v -"$KEEPDAY"d +%y%m%d`.gz

HOME_DIR=/hamehame/
BACKUP_DIR=$HOME_DIR/db_backup

cd $BACKUP_DIR

mysqldump -Q --host=192.168.1.2 \
--user=oreore --password=**** --default-character-set=binary name_db >\
$DBDUMP_FILE1

gzip $DBDUMP_FILE1 >/dev/null 2>&1

if [ $? != 0 -o ! -e $DBDUMP_FILE1 ]; then
echo "SUCCESS! MAYBE!"
rm -f $RMFILE1
exit 0
fi

Bシェルの鐔??事も
https://www.bangboo.com/cms/blog/page_97.html

-----------------------------------------

■2010-03-09投遞?
Like句ではバイナリか正鐔??表現の觸??險?

MySQL縺?LIKE文による抽出で期待通りの觸??索軆??果を出して縺?れなかった。
「絵コンテ」でヒットするのに「コンテ」ではヒットしなかった。

(藹??因)
MySQL4.0以臀??では日本鐔??は単なるバイナリ列と同程度の扱いだった。MySQL4.1以臀??では正蠑?に藹??言語に対応したようである。EUC-JPでも問題が出に縺?いみたいだ。

1)LIKEで觸??索したいフィールドに「BINARY」を付加する
 SELECT a FROM b LIKE BINARY 'ABC';
2)CREATE TABLE 時縺? varchar(255) BINARY と指定してお縺?

(簡単な回避方觸??)
3)バイナリが嫌ならLIKEの代繧?り縺?REGEXPを使う。これがオスス繝?
 SELECT a FROM b WHERE target LIKE '%~%'
 ではな縺?て、
 SELECT a FROM b WHERE target REGEXP '~'

他には文字コードを譏?記しておいた方がよいかも
CREATE TABLE `tablename` (
`id` int(11) NOT NULL auto_increment,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-----------------------------------------

■2007-05-24投遞?
HTML出力、PHP、MySQL、全驛?UTF-8
その時、??と文字化けが起こったぁぁ

//mySQLの文字コード
照合順蠎? : utf8_general_ci

//mysqlクライアント。コマンドラインからチェッ繧?
mysql> SHOW VARIABLES LIKE 'char%';
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |

//phpソースコード・文字コード設藹??
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

//phpソースコード繝?PHP内部文字コードとクエリ文字コード設藹??
<?php //charactor code for php internal
mb_language("uni");
mb_internal_encoding("utf-8");
mb_http_input("auto");
mb_http_output("utf-8");
// database connection
if (!mysql_connect("localhost", "id", "pswd"))
{
     die("Couldn't connect to MySQL");
}
if (!mysql_select_db("dbname"))
{
    die("Couldn't connect to the database");
}
//charactor code for query
$sql = mysql_query("SET NAMES utf8");
$result = mysql_query($sql);
?>

Set Names文のクエリ発鐔??がミソ。PHPで発鐔??してみる

twitter
Hatena
Google Buzz
newsing
Yahoo!
Buzzurl
Technorati
del.icio.us
Choix
Iza!
Livedoor Clip
Facebook
Evernote
 

Posted by funa : 05:02 AM | Web | Comment (0) | Trackback (0)