MySQLに日本語でINSERTできない場合


1. テーブル単位でEncodingタイプ設定

CREATE TABLE INSURANCE_RECOMM_TB (
id VARCHAR(10) PRIMARY KEY,
age int(5) NOT NULL,
sex VARCHAR(5) NOT NULL,
marriage VARCHAR(5) NOT NULL,
job VARCHAR(10) NOT NULL,
child VARCHAR(5) NOT NULL,
d_insurance VARCHAR(500),
c_insurance VARCHAR(500),
insurance_reason VARCHAR(500),
url VARCHAR(500)
)
ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;



2.Mysql設定でEncodingタイプ設定

MySQLは幾度もインストールしているが、毎回文字コードの設定では悩まされる。忘れてしまっていることもあるが、本質的に理解できていないので、毎回文字化けなどを起こしてしまうのだ。昨日も作成したデータベース日本語をINSERTしようとすると以下のようなエラーが出た。対応のメモを残しておく。

    Incorrect string value: '\xE3\x81\x95\xE3\x81\x82...' 
    for column 'NAME' at row 1 at com.mysql.jdbc

単に以下のようなINSERT文をJavaからexecuteUpdate()で実行しただけだ。同じことをMySQLコンソールからやった場合にはうまくいった。

    $ mysql -uroot -p***
    > use msql
    > create database test;
    > flush privileges; 
    > use test
    > create table DUMMY (
        ID      varchar(10)     primary key,
        NAME    varchar(20)     not null
    );
    > insert into DUMMY (ID, NAME) values ('001', 'たこはち');

以下のように対処した。まず、MySQLコンソールからcharacter_setをチェックしてみた。

    $ mysql -uroot -p***
    > use mysql
    > show variables like 'char%';
    +--------------------------+--------+
    | character_set_client     | latin1 |
    | character_set_connection | latin1 |
    | character_set_database   | latin1 |
    | character_set_filesystem | binary |
    | character_set_results    | latin1 |
    | character_set_server     | latin1 |
    | character_set_system     | utf8   |
    +--------------------------+--------+

character_set_databaseなどがlatin1になっているのでこれをsjisにする必要がある。MySQLインストール時にデフォルトのままだとlatin1(もしくはutf8)になる。スタートメニュー経由などでMySQL Server Instance Configuration Wizardを起動して、default character setの設定画面まで進める。このWizardは、以前、「MySQL 5.1.37のインストールで失敗」でも書いたように、何度も実行したことのあるMySQLInstanceConfig.exeだ。そこでデフォルトでlatin1になっているのをsjisに変更する。

また、MySQLインストール先にあるmy.iniファイルを開いてみて、default-character-set=latin1(もしくはutf8)となっていたら、それもsjisに変更する。Wizardを実行するとmy.iniファイルが更新されるが、必ずしもdefault-character-setは自動変更されないようなので、手作業で修正しておく。

    [mysql]
    default-character-set=sjis

    [mysqld]
    default-character-set=sjis

MySQLサービスを再起動後に、再度、MySQLコンソールからcharacter_setをチェックしてみる。

    $ mysql -uroot -p***
    > use mysql
    > show variables like 'char%';
    +--------------------------+--------+
    | character_set_client     | sjis   |
    | character_set_connection | sjis   |
    | character_set_database   | sjis   |
    | character_set_filesystem | binary |
    | character_set_results    | sjis   |
    | character_set_server     | sjis   |
    | character_set_system     | utf8   |
    +--------------------------+--------+

しかし、既存の作成済みのデータベースのcharacter_set_databaseは変わらないことに注意する必要がある。これはデータベースをdropして再作成するか、setコマンドで変更してやる必要がある。alter database文で文字コードを指定して変更することも、勿論可能だ。

    > use test
    > show variables like 'char%';
    +--------------------------+--------+
    | character_set_client     | sjis   |
    | character_set_connection | sjis   |
    | character_set_database   | latin1 |
    | character_set_filesystem | binary |
    | character_set_results    | sjis   |
    | character_set_server     | sjis   |
    | character_set_system     | utf8   |
    +--------------------------+--------+
    > set character_set_database = sjis;
    > show variables like 'char%';
    +--------------------------+--------+
    | character_set_client     | sjis   |
    | character_set_connection | sjis   |
    | character_set_database   | sjis   |
    | character_set_filesystem | binary |
    | character_set_results    | sjis   |
    | character_set_server     | sjis   |
    | character_set_system     | utf8   |
    +--------------------------+--------+

setコマンドでの変更も一時的には有効だ。しかし恒久的なものではなく、MySQLサービスが再起動されると元に戻ってしまう。以前には、サービス起動の引数でcharacter_setを指定したこともあるが、今回はやめておく。一番いいのは、作成済みのデータベースを一旦drop databaseして新たにcreate databaseする方法だろう。まだ実データがない開発段階では、それが望ましい。新規に作成したデータベースのcharacter_set_databaseにはsjisが適用されるようになる。

    > use test
    > show variables like 'char%';
    +--------------------------+--------+
    | character_set_client     | sjis   |
    | character_set_connection | sjis   |
    | character_set_database   | latin1 |
    | character_set_filesystem | binary |
    | character_set_results    | sjis   |
    | character_set_server     | sjis   |
    | character_set_system     | utf8   |
    +--------------------------+--------+
    > drop database test;
    > create database test;
    > use test
    > show variables like 'char%';
    +--------------------------+--------+
    | character_set_client     | sjis   |
    | character_set_connection | sjis   |
    | character_set_database   | sjis   |
    | character_set_filesystem | binary |
    | character_set_results    | sjis   |
    | character_set_server     | sjis   |
    | character_set_system     | utf8   |
    +--------------------------+--------+

ちなみにJavaMySQLからデータベースに接続するときは、勿論、以下の感じでcharacterEncodingにSJISを指定しておくこと。

    try {
        DbUtils.loadDriver("com.mysql.jdbc.Driver");
    } catch (Exception ex) {
        ;
    }
//  String url = "jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=SJIS";
    String url = "jdbc:mysql://localhost/" + "test"; // database名がtestの場合
    Properties props = new Properties();
    props.put("user",       "root");                 // 任意
    props.put("password",   "***");                  // 任意
    props.put("useUnicode", "true");                 // これが必要
    props.put("characterEncoding", "SJIS");          // これが必要
    try {
        this.conn = DriverManager.getConnection(url, props);
    } catch (SQLException ex){
        ;
    }

[2010/02/02追記]

文字コード関連の変数についての情報があったので追記しておく。文字コードはcreate database文やalter database文でが指定でき、databaseごとに使い分けが行える。character_set_database, character_set_client, character_set_connection, character_set_resultsは同じ文字コードに設定しておくことが無難そうだ。

変数内容
character_set_systemシステムがテーブル名やカラム名などの登録する際に使用する文字コード。utf8で固定されている。
character_set_servercharacter_set_databaseのデフォルト値となる文字コード
character_set_databasecreate database文で文字コードが指定されなかった場合、作成されたdatabaseの文字コードはこれになる。character_set_connectionのデフォルト値になる。
character_set_clientサーバクライアントから受け取るSQL文の文字コード
character_set_connectionクライアントから受け取ったSQL文をサーバが、この文字コードに変換して取り込む。通常は、character_set_client,character_set_connection,character_set_resultsは同じ文字コードにする。
character_set_resultsサーバクライアントに返す結果の文字コード。この変数をnullに設定すると、結果に対する文字コード変換は行われない。

データベース作成流れ

データベース作成(スキーマ作成)

→テーブル作成

→ユーザー作成

→権限付与

→Mysql稼働


データベース作成




データベースを作成するSQL文は以下の通りです。

mysql -u root -- rootでログイン

 CREATE DATABASE データベース名
 [CHARACTER SET = 文字コード名, COLLATION = COLLATION名];

 ※ []内は必須ではないオプションです

データベース作成時に利用できるオプションは文字コードCHARACTER SETおよび文字の照合順序COLLATION です。サーバ全体で文字コードを指定している場合には個別のデータベースで再度指定する必要は通常はありません。なんらかの理由で特定のデータベースの文字コードを変更したい場合のみに変更します。

文字の照合順序とは、例えばひらがなとカタカナ、または全角と半角のある文字、またはを別の文字を同一の文字と見なすかなどを挙動を設定します。どのような文字か同一と見なされるかは、MySQLユーザ会会長とみたまさひろさんのブログにまとめられていますので参照してください。


テーブル作成


データベースを作成するSQL文は以下の通りです。主なオプションのみ記載します。

CREATE TABLE テーブル名
  (列の定義) [テーブルオプション]

列の定義は、列の名称とデータ型、列のオプションの組み合わせになります。列のオプションでは、その列をインデックスに指定する場合は種類などが設定できます。他にも列ごとに文字コードを定義することや、初期値および制約の設定もオプションとして設定可能です。具体的な構文の例は後ほど改めて紹介します。

インデックスの種類
種類定義オプション名詳細
主キーPRIMARY 行を識別するための列。重複する値は格納できず、NULLも格納できない。
ユニークキーUNIQUE主キーに似て、重複する値は格納できないが、NULLは格納できる。
ノンユニークキーKEY重複する値は格納できる。
空間インデックスSPATIAL座標などの空間情報を格納するための特殊なインデックス ※MyISAMのみ
全文検索インデックスFULLTEXT全文検索のための特殊なインデックス ※日本語非対応



ユーザー作成

mysql -u root -- rootでログイン create user {user名}@localhost identified by {パスワード} -- ユーザー作成

作成したユーザーの確認

use mysql -- DB'mysql'に移動 select user,host from mysql.user -- ユーザーを確認

権限追加

構文

grant {権限内容} on {権限対象} to {ユーザー名}@{ホスト名} identified by {パスワード}
*権限対象はdatabase.tableで構成。test_db.*はtest_dbのあらゆるTableへの権限付与を意味


*Mysql버전 8부터 identified 이후가 없어짐

grant select on test_db.* to test@{権限付与対処のIPアドレス} identified by {パスワード};

->

grant select on test_db.* to test@{権限付与対処のIPアドレス}

-- test_dbのselect権限をtestユーザーに追加 grant select on test_db.* to test@{権限付与対処のIPアドレス} identified by {パスワード}; -- test_dbの全権限をtestユーザーに追加 grant all on test_db.* to test@{権限付与対処のIPアドレス} identified by {パスワード}; -- 全DBの全権限をtestユーザーに追加 grant all on *.* to test@{権限付与対処のIPアドレス} identified by {パスワード};


--権限確認

SHOW GRANTS for 'hoge'@'%';



追加した権限の確認

  • dbテーブル

host名、db名、user名、追加されている権限一覧を確認

    select user,host from mysql.user


    • 追加したdbへのアクセス
    -- 作成したユーザーでログイン
    mysql -u test -p
    
    -- db確認。 権限を追加したDBを確認できる。
    show databases
    


    • 外部から追加したdbへのアクセス
    • -- 作成したユーザーでログイン mysql -h [ターゲットのDBサーバー] -u test -p -- db確認。 権限を追加したDBを確認できる。 show databases


    権限削除

    構文

    revoke {権限内容} on {権限対象} to {ユーザー名}@{ホスト名} identified by {パスワード}

    -- testユーザーからfile権限を削除
    revoke file on *.* from test@localhost;





    Mysql稼働・停止


    制御スクリプトオプション

    オプション操作
    startmysqld デーモンを起動します。
    stopmysqld デーモンを停止します。
    restartmysqld デーモンを再起動します。
    statusmysqld デーモンの起動状況を確認します。
    condrestartmysqld デーモンが動作しているかを確認後、再起動します。(/var/lock/subsys/mysqld が存在するとき再起動します。)

    MySQL を起動するには、以下のコマンドを実行します。

    # /etc/init.d/mysqld start

    MySQL を停止するには、以下のコマンドを実行します。

    # /etc/init.d/mysqld stop

    Turbolinux 11 Server 起動時に MySQL を自動的に開始するには、以下のように chkconfig コマンドを実行しておきます。

    # chkconfig mysqld on










    root사용자의 비번을 알 경우

    1
    2
    C:> mysql -u root -p //root로 로그인
    C:> password :
    cs





    모든 사용자 확인

    1
    SQL > SELECT Host, User FROM mysql.user;
    cs




    데이터베이스 사용자 계정으로 로그인


    1
    2
    3
    4
    5
    c:/ > sqlplus "/as sysdba"
     
    SQL > show user
     
    SQL > select * from all_users;
    cs





    mysql 인스톨 후 root사용자의 임시비밀번호 발급 및 비밀번호 변경

    sudo grep 'temporary password' /var/log/mysqld.log
    Copy

    The output should look something like this:

    2018-05-23T10:59:51.251159Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: q&0)V!?fjksL
    Copy

    Make note of the password, because the next command will ask you to enter the temporary root password.

    Run the mysql_secure_installation command to improve the security of our MySQL installation:

    sudo mysql_secure_installation
    Copy
    Securing the MySQL server deployment.
    
    Enter password for user root:
    Copy

    After entering the temporary password you will be asked to set a new password for user root. The password needs to be at least 8-characters long and to contain at least one uppercase letter, one lowercase letter, one number, and one special character.

    The existing password for the user account root has expired. Please set a new password.
    
    New password:
    
    Re-enter new password:
    Copy

    The script will also ask you to remove the anonymous user, restrict root user access to the local machine and remove the test database. You should answer “Y” (yes) to all questions.







    계정 분실 시 사용자 계정으로 로그인


    sqlplus "/as sysdba" 로 로그인 하는경우에는 system 계정 패스워드 파일을 사용하거나 OS 인증을 사용한다.


    OS 인증의 경우에는 윈도우에서 ORA_DBA 그룹, 유닉스에서 dba 그룹인 경우 오라클이 설치된 컴에 administrator로 접속한 다음



    1
    2
    3
    4
    5
    6
    7
    C:\>sqlplus /nolog
     
    SQL > conn /as sysdba  - sys 로 로그인 한 경우와 같기 때문에 System계정의 암호를 변경 할 수 있다.
     
    SQL > alter user system identified by NEW_PASSWORD; - system의 새로운 비번 설정
     
    SQL > alter user sys identified by NEW_PASSWORD; - sys의 새로운 비번 설정
    cs



    *sys와 system 관리자의 차이

    1. SYS

    DBMS의 데이터 딕셔너리 소유자, 오라클 데이터베이스 관리자(SUPER USER)

    디폴트 패스워드 : change_on_install(8i 이전버전)

    DB생성 가능


    2. SYSTEM

    SQL*FORMS등 툴을 위한 데이터딕셔너리 소유자

    디폴트 패스워드 : manager(8i 이전버전)

    권한은 SYS와 같으나 DB생성 권한은 없음


    3. scott

    샘플 사용자 계정

    디폴트 패스워드: tiger




    계정 생성(계정생성은 시스템관리자 로그인 후 가능하다)

    1
    SQL > CREATE USER valuefactory identified by 1234; -패스워드 변경도 가능
    cs


    http://valuefactory.tistory.com/287?category=777823에서 계정생성시 권한부여에 대한 자세한 내용참고




    권한부여

    1
    SQL>grant connect, resource to valuefactory;
    cs


    http://jihwan4862.tistory.com/78 에서 권한 부여에 대한 자세한 내용 참고



    계정 삭제


    1
    SQL > drop user valuefactory cascade;
    cs


    + Recent posts