sjisでの文字化けを回避するための方法
MySQLの設定
- 下記のような状態になるように設定する。
- MySQLとconnectした後にset names sjis;を発行する。
mysql> SHOW VARIABLES LIKE 'character\_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | cp932 | | character_set_connection | cp932 | | character_set_database | cp932 | | character_set_filesystem | binary | | character_set_results | cp932 | | character_set_server | cp932 | | character_set_system | utf8 | +--------------------------+-------- 7 rows in set (0.00 sec)
● システム変数の用途
character_set_system
"indentifiers" (テーブル名とかカラム名?) を格納するのに使われる。 utf8で 固定。
character_set_server
character_set_database のデフォルト値に影響する。
character_set_database
CREATE DATABASE で文字コードが指定されなかった場合、database の文字コー ドはこれになる。 character_set_connection の値に影響する
character_set_client
クライアントから渡された SQL 文はこの文字コードであると解釈される。
character_set_connection
キャラクタセットイントロデューサ (例えば『_ujis'ほげ'』)が省略された SQL 文中の文字列リテラルはこの文字コードであると解釈される。
character_set_results
サーバーがクライアントに返す結果をこの文字コードに変換する。 この変数を NULL にセットすると、結果に対する文字コード変換をしないよ うにできる。
Linux での mysql.cnfの設定
win用と同じ設定にしてもうまくいかなっかった。グローバル値は上記のようになったが、セッション値はujisになった。よって自動変換をしないようにskipしたら直った。
null の演算
- Accessの場合はNz()関数
- MySQLではcoalesce() 関数は、最初の null でないデータを返す。 coalesce($変数,0)
select coalesce(null, 'abc', 'def'); +------------------------------+ | coalesce(null, 'abc', 'def') | +------------------------------+ | abc | +------------------------------+
別名での定義(レスポンスに差があるのか)
-
別名を使用したとき
select seisank_ns.katasikic from seisank_ns inner join (select seisank_nsh.katasikic from seisank_nsh) as H on seisank_ns.katasikic = H.katasikic
id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY ALL 507 1 PRIMARY seisank_ns index alt2 58 4340 Using where; Using index 2 DERIVED seisank_nsh index atl1 58 507 Using index
-
使用しなかったとき
select seisank_ns.katasikic from seisank_ns inner join seisank_nsh on seisank_ns.katasikic = seisank_nsh.katasikic
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE seisank_nsh index atl1 58 507 Using index 1 SIMPLE seisank_ns index alt2 58 4340 Using where; Using index
やっぱり、副問い合わせの分が余分にかかっている。
2つのカラムでLike句を使う
2つのテーブル顧客住所と住所があります。
顧客ID | 住所1 | 住所2 |
1 | 北海道 | 札幌市手稲区○○ |
2 | 北海道 | 旭川市△■ |
住所ID | 市区町村名 | 文字数 |
1 | 札幌市手稲区 | 6 |
2 | 旭川市 | 3 |
住所テーブルを使って、顧客テーブルの住所1の北海道(都道府県)を市区町村に置き換えます。
Accessでは
UPDATE 顧客, 住所 SET 顧客.住所1 = 住所!市区町村名, 顧客.住所2 = Right([住所2],Len([住所2])-住所!文字数) WHERE (((顧客.住所2) Like [住所]![市区町村名] & "*"));
MySQLでは
UPDATE 顧客, 住所 SET 顧客.住所1 = 住所!市区町村名, 顧客.住所2 = Right(住所2,CHAR_LENGTH(住所2-住所.文字数) WHERE (((顧客.住所2) Like concat(住所.市区町村名,'%') ));
ポイントは文字列の連結にconcatを使うことと、文字列の長さを求めるのにCHAR_LENGTHを使うこと
SQLServerではうまく行きませんでした。直積の書き方が違うみたい。「UPDATE 顧客, 住所」のところでエラーが出る。
結果は
顧客ID | 住所1 | 住所2 |
1 | 札幌市手稲区 | ○○ |
2 | 旭川市 | △■ |
nonプログラミングでこんな処理ができます。SQLは便利だ。
ODBCドライバーのエラー
[MySQL][ODBC 3.51 Driver]Lost connection to MySQL server at 'reading initial communication packet', system error: 0
新しいPCにODBCドライバーをインストールしましたが、上記エラーで繋がりません?何でだろう?
このページを読むと http://stackoverflow.com/questions/961928/could-not-connect-lost-connection-to-mysql-server-at-reading-initial-communica やはりセキュリティの関係のようでした。MySQLが動いているLinuxサーバーのhosts関係に新しくつなぐPCを登録して事なきを得ました。