+ All Categories
Home > Documents > MySQL日本語処理完全解説 -...

MySQL日本語処理完全解説 -...

Date post: 22-May-2020
Category:
Upload: others
View: 4 times
Download: 0 times
Share this document with a friend
64
1 MySQL MySQL 日本語処理完全解説 日本語処理完全解説 住商情報システム株式会社 住商情報システム株式会社 プラットフォームソリューション事業部門 プラットフォームソリューション事業部門 IT IT 基盤ソリューション事業部 基盤ソリューション事業部 オープンソースシステム部 オープンソースシステム部 玉川 玉川 修一 修一
Transcript
Page 1: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

11

MySQLMySQL日本語処理完全解説日本語処理完全解説

住商情報システム株式会社住商情報システム株式会社プラットフォームソリューション事業部門プラットフォームソリューション事業部門

ITIT基盤ソリューション事業部基盤ソリューション事業部

オープンソースシステム部オープンソースシステム部玉川玉川 修一修一

Page 2: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

22

今日の内容今日の内容

MySQLMySQL概要概要

日本語処理対策日本語処理対策

––問題点問題点

––原因原因

––解決策解決策

Page 3: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

33

MySQLMySQL概要概要

Page 4: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

44

MySQLMySQLととはは-- オープンソースのデータベースオープンソースのデータベース

スウェーデン発スウェーデン発

オープンソースのオープンソースのRDBMSRDBMS 11日あたりの平均ダウンロード数日あたりの平均ダウンロード数55万万

全世界で全世界で10100000万万インストレーションインストレーション((20062006年年44月現在月現在))

普及度は世界普及度は世界No.1No.1ののOSS RDBMSOSS RDBMS

Page 5: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

55

MySQLMySQLバージョンバージョン-- 4.04.0以下と以下と4.14.1以上では日本語の取り扱いが異なる以上では日本語の取り扱いが異なる

5.1(beta)5.1(beta) 5.0(GA)5.0(GA) 4.1(GA)4.1(GA) 4.0(old)4.0(old) 3.23(old)3.23(old)

※※GA:GA: Generally AvailableGenerally Available

Page 6: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

66

日本語処理の留意点日本語処理の留意点-- いろいろありますいろいろあります

1.1. 文字化け対策基礎文字化け対策基礎

2.2. クライアントライブラリクライアントライブラリ

3.3. ((株株))問題問題

4.4. UnicodeUnicode変換変換ルール問題ルール問題

5.5. ラウンドトリップラウンドトリップ変換問題変換問題

6.6. JavaJavaのキャラクターセットのキャラクターセット

7.7. 日本語日本語メタデータメタデータ

8.8. 日本語日本語全文検索全文検索

Page 7: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

77

1.1.文字化け対策基礎文字化け対策基礎

Page 8: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

88

FAQFAQ 特に特に ver.4.1ver.4.1のリリース以降のリリース以降

他のマルチバイトユーザーも経験他のマルチバイトユーザーも経験

““MySQLMySQLで文字化けしてしまいます!で文字化けしてしまいます!””

Page 9: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

99

文字化けの例文字化けの例-- 4.14.1ををインストールはしてみたもののインストールはしてみたものの……

mysql> CREATE TABLE t1(a CHAR(1))mysql> CREATE TABLE t1(a CHAR(1))> DEFAULT CHARACTER SET = sjis;> DEFAULT CHARACTER SET = sjis;

Query OK, 0 rows affected (0.09 sec)Query OK, 0 rows affected (0.09 sec)

mysql> INSERT INTO t1 VALUES('mysql> INSERT INTO t1 VALUES('ああ');');Query OK, 1 row affected, 1 warning (0.05 sec)Query OK, 1 row affected, 1 warning (0.05 sec)

mysql> SELECT * FROM t1;mysql> SELECT * FROM t1;++------------++| a || a |++------------++| ? || ? |++------------++1 row in set (0.00 sec)1 row in set (0.00 sec)

?

Page 10: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

1010

MySQLMySQLで日本語使えるで日本語使える??-- はい、ちゃんと使えます。はい、ちゃんと使えます。

ほとんどの場合が「キャラクターセット」のほとんどの場合が「キャラクターセット」の設定ミスが原因設定ミスが原因

正しい設定を行えば、簡単に解決できる正しい設定を行えば、簡単に解決できる場合が多数場合が多数

Page 11: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

1111

問題を理解する為に問題を理解する為に-- まずは基礎から解説まずは基礎から解説

キャラクターセットとは?キャラクターセットとは?

主なキャラクターセット主なキャラクターセット

MySQLMySQL 4.04.0以下以下 とと MySQL 4.1MySQL 4.1以上以上のの

違い違い

Page 12: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

1212

MySQLMySQLのキャラクターセットとは?のキャラクターセットとは?

-- 文字集合文字集合 + + 文字エンコーディング文字エンコーディング

文字集合文字集合––どんな文字が使えるかどんな文字が使えるか

文字エンコーディング文字エンコーディング––どうやって文字を表現するかというルールどうやって文字を表現するかというルール

sjis sjis エンコーディングで「あ」という文字はエンコーディングで「あ」という文字は 「「0x82A00x82A0」と表現」と表現

ujis ujis エンコーディングで「あ」という文字はエンコーディングで「あ」という文字は 「「0x0xA4AA4A22」と表現」と表現

MySQLMySQLのキャラクターセットのキャラクターセット––文字集合と文字エンコーディングの組み合わせ文字集合と文字エンコーディングの組み合わせ

文字コード文字コード––あるキャラクターセットにおける文字の値あるキャラクターセットにおける文字の値

sjissjisキャラクターセットで、「あ」の文字コードは「キャラクターセットで、「あ」の文字コードは「0x82A00x82A0」」

Page 13: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

1313

現在使える現在使える主なキャラクターセット主なキャラクターセット-- 日本語が使えるのは日本語が使えるのは66種類種類

ujisujisの文字集合に加え、の文字集合に加え、 NECNEC特殊文字等の外字が使用可能特殊文字等の外字が使用可能

文字コード体系は文字コード体系はujisujisとほぼ同等とほぼ同等eucjpmseucjpms

MySQLMySQLのデフォルトキャラクターセットのデフォルトキャラクターセット

ASCIIASCII文字、アクセント付アルファベットのみ使用可能文字、アクセント付アルファベットのみ使用可能latin1latin1

各国言語が使用可能な国際文字集合各国言語が使用可能な国際文字集合

Ver. 4.1Ver. 4.1以降で使用可能以降で使用可能ucs2ucs2

各国言語が使用可能な国際文字集合各国言語が使用可能な国際文字集合

Ver. 4.1Ver. 4.1以降で使用可能以降で使用可能utf8utf8

sjissjisの文字集合に加え、の文字集合に加え、NECNEC特殊文字等の外字が使用可能特殊文字等の外字が使用可能

文字コード体系は文字コード体系はsjissjisとほぼ同等とほぼ同等cp932cp932

主に主にUnix/LinuxUnix/Linux向け向け

sjissjisの文字集合に加えて、補助漢字等が使用可能の文字集合に加えて、補助漢字等が使用可能ujisujis

主に主にWindowsWindows向け向け

ASCIIASCII文字、ひらがな、カタカナ、文字、ひらがな、カタカナ、JISJIS第一、第二水準第一、第二水準

漢字等が使用可能漢字等が使用可能

sjissjis

Page 14: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

1414

MySQL 4.0MySQL 4.0以下の以下の処理処理-- 文字コードの変換はなし文字コードの変換はなし

クライアントクライアント ⇒⇒ サーバーサーバー––文字コードをそのまま格納文字コードをそのまま格納

サーバーサーバー ⇒⇒ クライアントクライアント––文字コードをそのまま表示文字コードをそのまま表示

クライアント サーバー

あ(0x82A0)

あ(0x82A0)

Page 15: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

1515

MySQL 4.0MySQL 4.0以下の以下の処理処理-- latin1latin1でも日本語でも日本語OKOK

キャラクターセットにかかわらず、文字キャラクターセットにかかわらず、文字コードをそのまま送受信コードをそのまま送受信

キャラクターセットがデフォルトのキャラクターセットがデフォルトのlatin1latin1でも日本語の利用は(見かけ上でも日本語の利用は(見かけ上**)可能)可能

だっただった

キャラクターセットキャラクターセットを変換する機能はないを変換する機能はない

**文字列長の認識や、ソート順序に影響有り文字列長の認識や、ソート順序に影響有り

Page 16: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

1616

MySQL 4.MySQL 4.11以上の以上の処理処理-- 機能が強化され高度になりました機能が強化され高度になりました

テーブル(カラム)キャラクターセットのテーブル(カラム)キャラクターセットの概念概念

文字コード変換機能文字コード変換機能 + + UnicodeUnicodeサポートサポート

文字コードの自動変換機能文字コードの自動変換機能

キャラクターセット変数の追加キャラクターセット変数の追加

Page 17: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

1717

MySQL 4.1MySQL 4.1以上以上の処理の処理-- テーブルキャラクターセットが指定できますテーブルキャラクターセットが指定できます

CREATE TABLE `table1` (CREATE TABLE `table1` (`column1` char(8) default NULL`column1` char(8) default NULL

) ENGINE=) ENGINE=MyISAMMyISAMDEFAULT CHARSET=sjisDEFAULT CHARSET=sjis

Page 18: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

1818

MySQL 4.1MySQL 4.1の処理の処理-- UnicodeUnicodeを介して変換できますを介して変換できます

sjis

ujis

latin1

Unicode(ucs2)

sjis

ujis

utf8utf8

latin1

… …

Page 19: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

1919

MySQL 4.1MySQL 4.1のの処理処理-- 自動変換が行われます自動変換が行われます

クライアント サーバー

sjis

あ(0x82A0)

ujis

あ(0xA4A2)

自動変換

Page 20: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

2020

MySQL 4.1MySQL 4.1の処理の処理-- 変数が増えました変数が増えました

CREATE TABLE CREATE TABLE のデフォルトキャラクタセットのデフォルトキャラクタセットcharacter_set_databasecharacter_set_database

サーバーサーバーCREATE DATABASE CREATE DATABASE のデフォルトのデフォルト

キャラクタセットキャラクタセット

character_set_servercharacter_set_server

返された結果を表示するキャラクタセット返された結果を表示するキャラクタセットcharacter_set_resultscharacter_set_results

テーブルアクセスのないサーバ処理のテーブルアクセスのないサーバ処理の

キャラクタセットキャラクタセット

character_set_connectioncharacter_set_connection

クライアントクライアントクライアントから入力された文字のクライアントから入力された文字のキャラクタセットキャラクタセット

character_set_clientcharacter_set_client

クライアントプログラム起動時の--default-character-set

オプションが影響

mysqld起動時の--default-character-set

オプションが影響

Page 21: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

2121

文字化け発生のメカニズム文字化け発生のメカニズム-- こんなイメージですこんなイメージです((4.1 <4.1 <))

クライアント(Windowsマシン)

サーバー

「あ」をInsert (0x82A0)

サーバー

default character set = sjis

クライアントキャラクタセット変数character_set_client = latin1character_set_connection = latin1character_set_result = latin1

入力された文は’0x82’と’0xA0’の

2文字だな

送られてきた文字はlatin1の’0x82’と’0xA0’か…。テーブルがsjis

なので、sjisに変換だ!

今から送る文字はlatin1の’0x82’と’0xA0’

だぞ!

文字化け発生

あ -> ??

Page 22: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

2222

文字化け発生の条件(文字化け発生の条件(4.1 <4.1 <))-- ポイントは変換と文字集合ポイントは変換と文字集合

文字コードの変換が発生文字コードの変換が発生

UnicodeUnicodeととのマッピングが定義されていないのマッピングが定義されていない

––文字集合の範囲外文字集合の範囲外の文字を使用の文字を使用

––変換元と変換先の文字集合の違い変換元と変換先の文字集合の違い

Page 23: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

2323

対策対策((4.1 <4.1 <))

-- ポイントはポイントは変換の回避変換の回避

文字コードの変換を回避文字コードの変換を回避

––クライアントクライアント//サーバー間でキャラクターセットサーバー間でキャラクターセット

を統一を統一

変換元キャラクターセットと変換先キャラ変換元キャラクターセットと変換先キャラクターセットの互換性を理解して使用クターセットの互換性を理解して使用

Page 24: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

2424

対策対策((設定例設定例))-- この様に設定すればこの様に設定すればOKOK

mysqlmysqlクライアントを使う限りではクライアントを使う限りではmy.cnfmy.cnfファイルで設定可能ファイルで設定可能

[mysql[mysqldd]]defaultdefault--charactercharacter--set = sjisset = sjis

[mysql][mysql]defaultdefault--charactercharacter--set = sjisset = sjis

Page 25: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

2525

2.2.クライアントライブラリクライアントライブラリ

Page 26: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

2626

問題はクライアントライブラリ問題はクライアントライブラリ-- キャラクターセットは常にキャラクターセットは常にlatin1latin1

my.cnfmy.cnfでは設定済みでは設定済み

mysqlmysqlクライアントでは問題なしクライアントでは問題なし

PHPPHP等のプログラムでは文字化け等のプログラムでは文字化け

問題はバイナリ配布のクライアント問題はバイナリ配布のクライアントライブラリライブラリ

キャラクターセットはキャラクターセットはlatinlatin11でコンパイルでコンパイル

my.cnfmy.cnfファイルの設定ファイルの設定は影響しないは影響しない

Page 27: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

2727

対策対策-- 方法は方法は33通り通り

ソースからコンパイルソースからコンパイル./configure ./configure ----withwith--charset=charset=character_set_namecharacter_set_name

接続直後に接続直後にSET NAMES SET NAMES character_set_namecharacter_set_nameの実行の実行

mysqldmysqld起動オプション起動オプション----skipskip--charactercharacter--setset--clientclient--handshakehandshake((MySQL 4.1.15, 5.0.13MySQL 4.1.15, 5.0.13~)~)

Page 28: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

2828

対策対策-- この様に設定すればこの様に設定すればOKOK(例)(例)

my.cnf my.cnf ファイルファイル

[mysqld][mysqld]defaultdefault--charactercharacter--set = sjisset = sjisskipskip--charactercharacter--setset--clientclient--handshakehandshake

[mysql][mysql]defaultdefault--charactercharacter--set =sjisset =sjis

Page 29: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

2929

3.(3.(株株))問題問題

Page 30: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

3030

文字化けの例文字化けの例-- ㈱㈱が文字化け!が文字化け!

mysql> CREATE TABLE `table1` (`column1` char(8))mysql> CREATE TABLE `table1` (`column1` char(8))--> ENGINE=MyISAM> ENGINE=MyISAM--> DEFAULT CHARSET=utf8;> DEFAULT CHARSET=utf8;

Query OK, 0 rows affected (0.12 sec)Query OK, 0 rows affected (0.12 sec)

mysql> insert into table1 values('mysql> insert into table1 values('㈱㈱');');Query OK, 1 row affected, 1 warning (0.00 sec)Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from table1;mysql> select * from table1;++------------------++| column1 || column1 |++------------------++| ? || ? |++------------------++

Page 31: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

3131

「「((株株))」問題」問題-- 機種依存文字の文字化け機種依存文字の文字化け

WindowsWindows機種依存文字が化けする問題機種依存文字が化けする問題

––NECNEC特殊文字特殊文字

––IBMIBM拡張文字拡張文字

––NECNEC選定選定IBMIBM拡張文字拡張文字

WindowsWindowsのシフトのシフトJISJISととMySQLMySQLののsjissjisのの文字集合の違いが原因文字集合の違いが原因

Page 32: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

3232

イメージ図イメージ図-- 変換マッピングルールがないのです変換マッピングルールがないのです

sjisの

文字集合

sjis ucs2 utf8

マッピングなし

マッピングあり マッピングあり

文字化け

?sjisではカバー

されない文字集合 ?

Page 33: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

3333

““シフトシフトJISJIS””とと ““sjissjis””-- 実は違うんです実は違うんです

MySQLMySQLのの””sjissjis””ははIANAIANAのの””Shift_JISShift_JIS”” WinWinddowsowsのの””シフトシフトJISJIS””ははWindows Code Windows Code

Page 932Page 932(通称(通称cp932cp932))

IANAIANAではではWindows31Windows31--JJに相当に相当

cp932/Windows31cp932/Windows31--JJの文字集合をカの文字集合をカバーするキャラクターセットが必要バーするキャラクターセットが必要

※※解決策は後ほど解決策は後ほど……

Page 34: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

3434

4.4.UnicodeUnicode変換変換ルールルール問題問題

Page 35: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

3535

UnicodeUnicode変換変換ルールルール問題問題-- 変換ルールも異なる変換ルールも異なる””シフトシフトJISJIS””

この世には異なるシフトこの世には異なるシフトJISJISが存在が存在

それぞれ一部の文字についてそれぞれ一部の文字についてUnicodeUnicodeへの変換への変換ルールルールが異なるが異なる

変換が異なる文字変換が異なる文字の例の例

\~‖-¢£¬\~‖-¢£¬

Page 36: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

3636

UnicodeUnicode変換変換ルールルール問題問題-- UnicodeUnicodeに変換すると違う文字に!に変換すると違う文字に!

0x8191¢(全角)

sjis

0x8191¢(全角)

その他

ucs20x00A2¢ (半角)

変換の結果全角が半角に!

0xFFE0¢(全角)

変換後も全角のまま

sjis

※※解決策は後ほど解決策は後ほど……

Page 37: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

3737

5.5.ラウンドトリップ問題ラウンドトリップ問題

Page 38: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

3838

ラウンドトリップ問題ラウンドトリップ問題-- ディレクトリパスがディレクトリパスが変変!?!?

Page 39: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

3939

ラウンドトリップ問題ラウンドトリップ問題-- こんなイメージですこんなイメージです

0x005C¥

ucs2

sjis

0x5C¥

異なる複数の文字が一つの文字に変換

0x815F\

戻す時はどちらか選ばないといけない

結果として片方の文字が消えてしまう

sjis

0x5C¥

0x815F\

Page 40: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

4040

解決策解決策-- cp932cp932でで33つまとめてつまとめて全て解決全て解決

新キャラクターセット新キャラクターセットcp932cp932を実装を実装

33つの問題すべて解決つの問題すべて解決

––㈱問題㈱問題

––UnicodeUnicode変換ルール問題変換ルール問題

––ラウンドトリップ問題ラウンドトリップ問題

ちなみにこれ、ちなみにこれ、SCSSCSがやりましたがやりました

Page 41: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

4141

cp932cp932とはとは

sjissjisの拡張の拡張

WindowsWindows機種依存文字をカバー機種依存文字をカバー

––((株株))問題を解決問題を解決

WindowsWindows方式の方式のUnicodeUnicode変換変換

––UnicodeUnicode変換ルール問題を解決変換ルール問題を解決

––ラウンドトリップ問題を解決ラウンドトリップ問題を解決

Page 42: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

4242

sjissjisととcp932cp932-- 文字集合が違います文字集合が違います

jisx0201

jisx0208

jisx0201

jisx0208

㈱Ⅰ①㍻℡

纊褜鍈

纊褜鍈

%&¥ abc 123アイウ

あいうアイウ亜井宇

sjis cp932

NEC特殊文字

IBM拡張文字

NEC選定IBM拡張文字

Page 43: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

4343

0x8191¢

sjis

0x5C¥

ucs2cp932

sjissjisととcp932cp932-- 変換ルールも違います変換ルールも違います

0x815F\

0xFFE0¢

0x005C¥

0xFF3C\

Page 44: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

4444

sjissjisととcp932cp932-- ユーザー定義領域もカバーユーザー定義領域もカバー

Page 45: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

4545

eucjpmseucjpms-- ujisujisでで((株株))を使いたい場合にを使いたい場合に

ujisujisの拡張の拡張

cp932cp932互換互換

ujisujisででWindowsWindows機種依存文字を格納機種依存文字を格納するする場合に使用場合に使用

5.05.0以上で使用可能以上で使用可能

詳細は日本詳細は日本MySQLMySQLパートナ会の記事参照パートナ会の記事参照「「cp932 cp932 eucjpmseucjpms」で」でGoogle!Google!

Page 46: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

4646

対処方法対処方法-- sjis/ujissjis/ujisよりもよりもcp932/eucjpmscp932/eucjpmsをを

my.cnf my.cnf ファイルファイル

[mysqld][mysqld]

defaultdefault--charactercharacter--set = cp932set = cp932

skipskip--charactercharacter--setset--clientclient--handshakehandshake

[[mysqlmysql]]

defaultdefault--charactercharacter--set = cp932set = cp932

※※cp932: 4.1,5.0cp932: 4.1,5.0

※※eucjpms: 5.0eucjpms: 5.0

Page 47: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

4747

6.Java6.Javaの注意点の注意点

Page 48: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

4848

JavaJavaととMySQLMySQLのキャラクターセットのキャラクターセット-- Connector/JConnector/Jでマッピングでマッピング

キャラクターセットの名称はキャラクターセットの名称はJavaJavaととMySQLMySQLで異なるで異なる

ConnectorConnector/J/Jでマッピングでマッピング

例)例)

((MySQLMySQL) cp932 = (Java) MS932) cp932 = (Java) MS932(MySQL) cp932 = (Java) Windows(MySQL) cp932 = (Java) Windows--31J31J

Page 49: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

4949

cp932cp932使用時の問題点使用時の問題点-- ConnectorConnector/J/Jががcpcp932932に完全対応していなかったに完全対応していなかった

WindowsWindows--31J(MS932)31J(MS932)を使用してもを使用しても((株株))をを表示できない表示できない!!??

INSERTINSERTは出来るがは出来るがSELECTSELECTはエラーにはエラーに

JVMMySQL

Connector/J

cp932cp932MS932MS932cp932cp932WINDOWS31WINDOWS31--JJ

cp932cp932未定義未定義

cp932cp932未定義未定義

cp932cp932MS932MS932cp932cp932WINDOWS31WINDOWS31--JJ

Page 50: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

5050

eucjpmseucjpms使用時の問題点使用時の問題点-- eucjpmseucjpmsととJavaJavaのキャラクターセットは非完全互換のキャラクターセットは非完全互換

eucjpmseucjpmsは互換性のないは互換性のないEUC_JPEUC_JPにに

マッピングマッピング

((株株))が文字化けが文字化け

JVMMySQL

Connector/J

eucjpmseucjpmsEUC_JPEUC_JP

eucjpmseucjpmsEUC_JPEUC_JP eucjpmseucjpmsEUC_JP_SolarisEUC_JP_Solaris

eucjpmseucjpmsEUC_JP_SolarisEUC_JP_Solaris

Page 51: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

5151

EUC_JP_SolarisEUC_JP_Solaris-- better solution (better solution (≠≠best solution)best solution)

eucjpmseucjpmsと完全互換のわけではないと完全互換のわけではない

互換互換性のない文字性のない文字

―― ‖‖ -- ¢¢ ££ ¬¬ ¦¦

このようなこのような特殊記号のみ影響特殊記号のみ影響但し、但し、((株株))は使用可能は使用可能

実は実はここれもれもSCSSCSが実装しましたが実装しました

Page 52: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

5252

対策対策-- JavaJavaでのまとめでのまとめ

cp932cp932にはにはWINDOWSWINDOWS--31J / MS93231J / MS932を使用を使用

eucjpmseucjpmsにはにはEUCEUC_JP_Solaris_JP_Solarisを使用を使用

––互換性のない文字について留意すること互換性のない文字について留意すること

ujisEUC_JP

eucjpmsEUC_JP_Solaris

sjisSJIS

utf8UTF-8

cp932MS932

cp932WINDOWS-31J

MySQL側キャラクターセットJava側キャラクターセット

(Connector/J ver. 3.1.9以上)

Page 53: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

5353

7.7.日本語テーブル名問題日本語テーブル名問題

Page 54: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

5454

日本語テーブル名問題日本語テーブル名問題

データベース名データベース名 = = ディレクトリ名ディレクトリ名

テーブル名テーブル名 = = ファイル名ファイル名

44.1.1以降、テーブル名、データベース名以降、テーブル名、データベース名等のメタデータは等のメタデータはutf8utf8で保存で保存

データベース名やテーブル名に日本語データベース名やテーブル名に日本語を使用した場合に問題あり(を使用した場合に問題あり(bug#3906bug#3906))

Page 55: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

5555

日本語テーブル名問題日本語テーブル名問題

Utf8で保存された名前を

使用してファイルを作成し、シフトJISで表示している為

文字化けが発生

Page 56: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

5656

日本語テーブル名問題日本語テーブル名問題

@+Unicodeコードポイントで表現

Ver. 5.1.6.にて修正

Page 57: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

5757

対処方法対処方法-- 日本語メタデータの使用は控えましょう日本語メタデータの使用は控えましょう

55.1.1を使用するまでは、日本語メタデータを使用するまでは、日本語メタデータ

を使用しない方が安全を使用しない方が安全

Page 58: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

5858

8.8.日本語全文検索日本語全文検索

Page 59: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

5959

MySQLMySQLで日本語全文検索で日本語全文検索-- 機能はあるが分かち書きが必要機能はあるが分かち書きが必要

MyISAMMyISAMストレージエンジンでは全文検ストレージエンジンでは全文検

索用インデックスをサポート索用インデックスをサポート

但し日本語但し日本語のような言語には未対応のような言語には未対応

別途分かち書きを行ってやる必要有り別途分かち書きを行ってやる必要有り

Page 60: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

6060

対処方法対処方法-- MySQLMySQL++SennaSenna**という選択肢という選択肢

組み込み型の全文検索エンジン組み込み型の全文検索エンジン

MySQLMySQLに組み込み可に組み込み可

SQLSQLのみで全文検索が可能にのみで全文検索が可能に

**未来検索ブラジルが開発した、オープンソースソフトウェア未来検索ブラジルが開発した、オープンソースソフトウェア

Page 61: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

6161

MySQLMySQL++SennaSenna-- 詳細はこちらで詳細はこちらで

OpenOpen Source PavilionSource Pavilion––MySQL + MySQL + SennaSennaを紹介を紹介

ブースブース

––MySQL 5.0 + SennaMySQL 5.0 + Sennaのデモ。のデモ。

Page 62: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

6262

まとめまとめ

Page 63: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

6363

まとめまとめ-- MySQLMySQLでの日本語処理対策での日本語処理対策

MySQL + Sennaを使用日本語全文検索

5.1まで原則使用しない日本語メタデータ

1. cp932に対してMS932/Windows-31Jを使用2. Eucjpmsに対してEUC_JP_Solarisを使用

JAVA

ラウンドトリップ問題

Unicode変換ルール問題

キャラクターセットcp932の使用(株)問題

1. --skip-client-character-set-handshake2. SET NAMES キャラクターセット名

3. ./configure –with-charset=キャラクターセット名

クライアントライブラリ

キャラクターセットオプションの設定基本的な文字化け

対策対策課題課題

Page 64: MySQL日本語処理完全解説 - scsk-db.jpscsk-db.jp/mysql/files/pdf/Interop2006MySQL_JP_handling.pdf · 15 MySQL 4.0以下の処理 - latin1でも日本語OK キャラクターセットにかかわらず、文字

6464

MySQLMySQLならならSCSSCS

MySQLMySQLオフィシャルトレーニングオフィシャルトレーニング

MySQLMySQLライセンスライセンス

システム構築システム構築

––詳細は詳細は www.scs.co.jp/mysqlwww.scs.co.jp/mysql

ご清聴ありがとうございました。ご清聴ありがとうございました。

ご質問はご質問は [email protected]@scs.co.jp までまで


Recommended