ma-100140 @ ウィキ MySQL関係
※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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を登録して事なきを得ました。