ホームにもどる      「パソコンについて」にもどる

MySQL
  1. ySQLの文字コードはデフォルトの設定はlatin1になっている。このlatin1に日本語は入らない。ところが、データベースをlatin1でつくり、クライアントの文字コードもlatin1にすると、ほとんどの場合、正常に表示されてしまう。一見何も問題ないかのように見える。しかしlatin1の設定では、蚊と隊、渦と並、靴と蝴、人と溺、騎と討の区別ができない。
    現在使っている文字コードが何かを知るには、MySQLコマンド画面で、
    show variables like 'character_set%'; と入力する。variablesはMySQLシステム変数を示し、likeは「〜のようなもの」という意味で、%はワイルドカード文字と言われ、任意の文字を示す。つまりこのコマンドは「character_setから始まるMySQLシステム変数を示して下さい。」という意味である。デフォルトの設定なら、
     +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | latin1                     |
    | character_set_connection | latin1                     |
    
    | character_set_filesystem | binary                     |
    | character_set_results    | latin1                     |
    | character_set_server     | latin1                     |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    と表示される。
    
    この状態で、次のコマンドを実行し、データベースKokoromiとテーブルShikenをつくる。なおMySQLコマンドは大文字、小文字を区別しない。下記のコードでは、大文字で書いたり、小文字で書いたりしている。
    CREATE DATABASE Kokoromi;
    
    use Kokoromi;
    
    CREATE TABLE Shiken(
    kanji VARCHAR(20),
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
    
    テーブルShikenにデータを挿入する。
    INSERT INTO Shiken(kanji) VALUES("蚊"); 
    INSERT INTO Shiken(kanji) VALUES("隊");
    INSERT INTO Shiken(kanji) VALUES("渦");
    INSERT INTO Shiken(kanji) VALUES("並");
    INSERT INTO Shiken(kanji) VALUES("靴");
    INSERT INTO Shiken(kanji) VALUES("蝴");
    INSERT INTO Shiken(kanji) VALUES("人");
    INSERT INTO Shiken(kanji) VALUES("溺");
    INSERT INTO Shiken(kanji) VALUES("騎");
    INSERT INTO Shiken(kanji) VALUES("討");
    
    SELECT * FROM Shiken WHERE kanji="蚊"; とすると、蚊と隊の二つを選択してしまう。
    SELECT * FROM Shiken WHERE kanji="隊"; としても、蚊と隊の二つを選択する。
    SELECT * FROM Shiken WHERE kanji="渦"; とすると、渦と並の二つを選択してしまう。
    SELECT * FROM Shiken WHERE kanji="並"; としても、渦と並の二つを選択する。
    SELECT * FROM Shiken WHERE kanji="靴"; とすると、靴と蝴の二つを選択してしまう。
    SELECT * FROM Shiken WHERE kanji="蝴"; としても、靴と蝴の二つを選択する。
    SELECT * FROM Shiken WHERE kanji="人"; とすると、人と溺の二つを選択してしまう。
    SELECT * FROM Shiken WHERE kanji="溺"; としても、人と溺の二つを選択する。
    SELECT * FROM Shiken WHERE kanji="騎"; とすると、騎と討の二つを選択してしまう。
    SELECT * FROM Shiken WHERE kanji="討"; としても、騎と討の二つを選択する。
    蚊と隊、渦と並、靴と蝴、人と溺、騎と討 の区別ができないのである。
    こういうことが起こらないようにするためには、文字コードの設定をutf8に変更しておく必要がある。
    文字コードの設定はmy.cnfでする。ubuntuなら、/etc/mysql/my.cnfにある。
    my.cnfの
    [client]
    の項目の所に
    default-character-set=utf8
    を書き加え、
    [mysqld]
    の項目の所に
    default-character-set = utf8
    skip-character-set-client-handshake
    character-set-server = utf8
    collation-server = utf8_general_ci
    init-connect = SET NAMES utf8
    を書き加える。
    再起動して、MySQLコマンド画面にshow variables like 'character_set%'; と入力すると、
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | utf8                       |
    | character_set_connection | utf8                       |
    | character_set_database   | utf8                       |
    | character_set_filesystem | binary                     |
    | character_set_results    | utf8                       |
    | character_set_server     | utf8                       |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------
    
    と表示される。character_setがutf8に変わっている。
    drop database Kokoromi;
    でデータベースKokoromiを削除した後、上のコマンドでまたデータベースKokoromiとテーブルShikenをつくり、データを挿入する。select文を実行してみると、蚊と隊、渦と並、靴と蝴、人と溺、騎と討 が区別され、ひとつしか選択しない。
    文字コードの変更をしなくても、ほとんどの場合正常に動いてしまうため、文字コードの変更を忘れていることに気づきにくい。注意する必要がある。
  2. ySQL を Windows にインストールした時、MySQL Command Line Client は、標準で、黒背景に白文字である。これは見にくいので、白背景に黒文字に変えたほうがよい。画面の上の MySQL Command Line Client と書いてある所にマウスの矢印を移動させて、右クリックする。プロパティを選び、左クリックする。次に画面の色タブをクリックすると、画面の文字、画面の背景の色を選択する画面が出てくる。
  3. ubuntuの端末でLinux コマンドでMySQLを開くには、
    mysql -u root -p
    と入力する。するとEnter password: と表示され、パスワードを聞いてくる。パスワードを入力すると、 mysql> と表示され、MySQLコマンドを入力できるようになる。
    u は user の略で、 p は password の略である。これを
    mysql --user root --password
    と書いても同じである。user password とフルネームで書くとわかりやすいが、- が2つ必要で、また文字数が多い分だけ入力が面倒になる。
    mysql --user=root --password
    と = をつけて書いてもよい。こちらがむしろ普通である。
    いまMySQLのパスワードを1234とする。
    mysql --user=root --password=1234
    と書くと、パスワードを入力せずに、mysql> が表示され、MySQLコマンドを入力できるようになる。ただ、安全面から、他人が読める形でパスワードを記入するには不安がある。これは
    mysql -u root -p1234
    と短縮形で書くこともできる。ここで注意すべきことは-p とパスワードの間にスペースを入れてはいけないことである。スペースを入れると1234をデータベース名ととる。そういうデータベース名がなければエラーになる。
    mysql -u root -p=1234
    のように-p とパスワードの間を=でつなぐこともできない。これもエラーになる。
    今、データベースの名前をShikenとする。
    mysql -u root -p でMySQLコマンドが入力できる状態になったとしても、どのデータベースにそのコマンドを実行するのかわからない。Shiken という名のデータベースにMySQLコマンドを実行したいなら、
    use Shiken
    と入力すると、Shikenデータベースにコマンドを実行することになる。これは
    use Shiken;
    のように、セミコロンをつけてもよい。
    mysql -u root -p Shiken
    と入力すると、use を使わずに、Shikenデータベースにコマンドが実できるようになる。パスワードを入力していないから、当然パスワードは聞いてくる。
    mysql -u root -p1234 Shiken
    と書くと、パスワードを聞かれることなく、ShikenデータベースにSQLコマンドが入力できるようになる。
    mysql --user=root --password=1234 Shiken
    と書いても同じことである。
  4. mysqldump
    今rootユーザー名をakiraとすると、homeフォルダの中にakiraというフォルダが自動的につくられる。akiraのパスは/home/akiraになる。このakiraはホームフォルダと言われ、通常ユーザーがつくったファイルはこのホームフォルダに保存される。端末はホームフォルダ、この場合はakiraフォルダをカレントフォルダとして起動する。
    mkdir Backuup
    でカレントフォルダにBackupというフォルダがつくられる。
    mysql -u root -p
    と入力すると、パスワードを聞いてくる。正しいパスワードを入力すると、 mysql> と表示され、SQLコマンドが入力できるようになる。
    create database Shiken;
    で Shiken という名のデータベースをつくる。注意しなければならないのは、MySQLコマンドの末尾にセミコロン ; が必要なことである。忘れるとエラーになる。
    このデータベース Shiken のデータをバックアップするのが、mysqldump コマンドである。
    mysql> が表示されているなら、
    quit;
    と入力して、Linuxコマンドが入力できる画面にもどす。
    rootユーザー名をakiraにしているから
    akira@akira-desktop:~$
    と表示される。
    mysqldump -u root -p Shiken > Backup/Shiken_Backup.aim
    で Shiken_Backup.aim という名のバックアップファイルがBackupフォルダの中にできる。拡張子 aim は適当につけたので、これでなければならないことはない。Shiken_Backup というファイル名も別のファイル名でも勿論よい。これは
    mysqldump --user=root --password Shiken > Backup/Shiken_Backup.aim
    と書いてもよい。
    上の2つの記入ではパスワードを書いていないので、パスワードを聞いてくる。今パスワードを1234とすると、
    mysqldump -u root -p1234 Shiken > Backup/Shiken_Backup.aim
    と書くと、パスワードを聞かれずにバックアップファイルができる。p とパスワードの間にスペースがいらないことに気をつける。これは
    mysqldump --u=root --password=1234 Shiken > Backup/Shiken_Backup.aim
    と書いてもよい。
    バックアップファイルからデータベースにデータをもどすには、
    mysql -u root -p Shiken < Backup/Shiken_Backup.aim
    と書く。ここで気をつけなければならないのは、mysqldumpでなく、mysql になっていることである。mysqldumpではデータをもどすことはできない。これは
    mysql --user=root --password Shiken < Back/Siken_Backup.aim
    と書いてもよい。
    上の2つの記入ではパスワードを書いていないので、パスワードを聞いてくる。今パスワードを1234とすると
    mysql -u root -p1234 Shiken < Backup/Shiken_Backup.aim
    と書くと、パスワードを聞かれずにデータをもどすことができる。p とパスワードの間にスペースがいらないことに気をつける。これは
    mysql --user=root --password=1234 Shiken < Backup/Shiken_Backup.aim
    と書いてもよい。
    USBメモリーのBackupフォルダに直接データをバックアップするには、
    mysqldump -u root -p Shiken > /media/disk/Backup/Shiken_Backup.aim
    と書く。これは
    mysqldump --user=root --password Shiken > /media/disk/Backup/Shiken_Backup.aim
    と書いてもよい。
    USBメモリーからShikenデータベースにデータをもどすには、
    mysql -u root -p Shiken < /media/disk/Backup/Shiken_Backup.aim
    と書く。
    mysql --user=root --password Shiken < /media/disk/Backup/Shiken_Backup.aim
    と書いてもよい。
  5. 今Apacheは/home/akira/wwwの文書を開いているとする。さらにShikenデータベースにJushoテーブルがあるとする。このテーブルのデータのバックアップをとるのに、テキストファイルをつくる方法がある。
    端末にuse Shiken と打ち込んでShikenデータベースを選択してから
    select * into outfile '/tmp/Jusho_Backup.txt' from Jusho;
    と打ち込む。これでtmpフォルダに Jusho_Backup.txtというテキストファイルができる。このテキストファイルはレコード毎に改行し、ひとつのレコードのフィールド間の区切りはタブでなされている。
    Ubuntu 7.10 では
    chmod o+rw /home/akira/www
    と打ち込んでwwwフォルダに読み書きの権限を与えることで、
    select * into outfile '/home/akira/www/Jusho_Backup.txt' from Jusho;
    と書き、wwwに Jusho_Backup.txtをつくることができた。しかしubuntu 8.04では、
    Can't create/write to file  という表示が出て、書き込みができなくなった。tmpフォルダに書き込む必要がある。
  6. Select * into outfile from で作ったテキストファイルをデータベースに挿入するには、load data infile into を用いる。
    /home/akira/www にJusho_Backup.txt があり、これをShikenデータベースのJushoテーブルに挿入するには、
    load data infile '/home/akira/www/Jusho_Backup.txt' into table Jusho;
    と書きEnterキーを押す。ただしchmod o+rw /home/akira/www でwwwフォルダに読み書きの権限を与えておかないとエラーになる。
    Apache は/home/akira/www のファイルを開いているとしている。つまり/home/akira/wwwをサーバホストとしていると仮定している。 Jusho_Backup.txt はサーバーホスト上にあるファイルだからJushoテーブルに挿入するのは、上記のような構文になった。しかしサーバーホストにないファイルを挿入したい時もある。その時はlocal を追加する。/tmp/Jusho_Backup.txt をJushoテーブルに追加するには、
    load data local infile '/tmp/Jusho_Backup.txt' into table Jusho;
    と書く。
  7. アクセス(Microsoft Access)のデータをMySQLでつくったデータベースに挿入する方法
    アクセスの試験,mdbデータベースに中に住所テーブルがあり、MySQLでつくったShikenデータベースにJushoテーブルがあるとする。住所テーブルのデータをJushoテーブルに移すのはどうすればおいのだろうか。
    まずJushoテーブルのフィールドを住所テーブルと同じようにつくる.。MySQLではフィールド名に全角文字は使えないから、アクセスのテーブルとまったく同じにすることはできないが、フィールドの型、フィールドの配置の順番は同じにする。
    アクセスはアクセス2000で説明する。
    住所テーブルを選択し、メニューバーでファイル→エクスポート と進む。あるいは住所テーブルを選択し右クリックしてエクスポートを選択する。「ファイルの種類」でテキストファイルを選択し、保存先を適宜変更し、ファイル名を適当につけて(この場合は住所バックアップ.txtとつけることにする)「保存」をクリックする。エクスポートウイザードで「区切り記号つきーカンマやタブなどでフィールドが区切られている」を選択する。「次へ」をクリックし、次の画面で「フィールド区切り記号」にタブを選択し、「テキスト区切り記号」で「なし」を選択し、「次へ」をクリックする。次の画面で「完了」をクリックする。これで住所バックアップ.txtができる。
    Linux上でMySQLを動かしている時はWindowsと文字コードが違うため文字コードを変換しておく必要がある。WindowsはShift Jis だが、LinuxではEUCやUTF-8が使われる。php.ini でPHPの文字コードをUTF-8に統一しているなら、Shift JisをUTF-8に変換する。端末に
    nkf -w 住所バックアップ.txt > 住所バックアップ_UTF8.txt
    と記入しEnterキーを押す。nkfが文字コードの変換をするLinuxコマンドで、-w がShift JisをUTF-8に変換するオプションである。
    次に住所バックアップ_UTF8.txtをJushoテーブルに挿入する。今akiraをホームフォルダとし、住所バックアップ_UTF8.txtをホームフォルダに置くとする。端末に
    mysql -u root -p
    と記入してEnterキーを押し、MySQLコマンドが入力できるようにする。
    use Shiken
    でShikenデータベースを選択する。
    load data local infile '/home/akira/住所バックアップ_UTF8.txt' into table Jusho
    と記入し、Enterキーを押すと、 住所バックアップ_UTF8.txtがJushoテーブルに挿入され、アクセスのデータのMySQLでつくったテーブルへの移動が終了する。
  8. mysql> select * from Jusho;
    でJushoテーブルのデータを表示させることができる。MySQLコマンドは ; があって終了になる。 ; を書かずにEnterキーを押すと行が変わる。行を変えて
    mysql> select *
           -> from
           -> Jusho;
    と記述しても同じことになる。
    行を変えたのだけど、またmysql>  にもどりたければ、\c と記入する。
    mysql> select *
           -> \c
    mysql>
  9. Shikenという名のdatabaseのデータをmysqldumpで取ろうとした時
    mysqldump: Got error: 1016: Can't open file: './Shiken/tameshi.frm' (errno: 24) when using LOCK TABLES
    のエラーが出ることがある。
    mysql> show variables like 'open_%' ;
    +------------------+-------+
    | Variable_name    | Value |
    +------------------+-------+
    | open_files_limit | 1185  |
    +------------------+-------+
    
    で開けるファイルのlimitが示される。このlimitを越えると上記のミスが出るようである。
    この上限はmy.cnfの[mysqld]の所に
    open_files_limit=2048
    のように書き加えて変更できる。
    CentOSなら、my.cnfは、/etcにあるので、
    端末を開いて、
    su -
    で管理者権限にしてから、
    vi /etc/my.cnf
    でmy.cnfを変更できる。
    変更をすると、一度電源を切ると、それが反映される。
    参考 https://d.hatena.ne.jp/end0tknr/20120104/1325658069
  10. ユーザー名 user, パスワード password, データベース名 database_mei としてmysqldumpを用いて、データのバックアップをdatabase_mei.aimに取る時、
    mysqldump -u user -ppassword database_mei > database_mei.aim
    と書く。理由ははっきりしないが、
    mysqldump: Got error: 1016: "Can't open file: './database_mei/shiken.frm' (errno: 24)" when using LOCK TABLES
    のエラーが出ることがある。この時は次のようにオプションをつけて書くとエラーは出なくなる。
    mysqldump -u user -ppassword --lock-tables=false database_mei > database_mei.aim

更新日:2018年8月29日

ホームにもどる      「パソコンについて」にもどる