mysql:9687
From: <takeshi@xxxxxxxxxx>
Date: Fri, 18 Jun 2004 09:40:42 +0900
Subject: [mysql 09687] Re: MySQL 4.1.2 の日本語の扱い
村上です。 At Sat, 12 Jun 2004 21:55:13 +0900, とみたまさひろ wrote: > > とみたです。 > mysqldump の場合は、あえて UTF-8 にしているのではないかという気がします。 > > たとえば、ujis でコンパイルされた mysqldump が、サーバ上の UTF-8 デー > タを勝手に EUC-JP に変換してしまうと、元に戻せない事態が発生します。だ > から、すべての charset のデータを保持できる UTF-8 を使用しているとか…。 おそらくそんなところです。 マッピングが食い違っている文字がありますが、それはとりあえず無視。 # 本当に utf-8-java とか utf-8-ms とか必要になってくるのではないか、と個人的には思います > > 残るテーマですが、 > > '自動変換いる?いらない?' > > です。 > > あれば結構便利だと思います。 > > 問題となる場合でも、クライアントから「変換しないで欲しい」ということを > サーバに伝えることができれば、今まで通り使用できると思うので、あまり問 > 題にはならないと思うので、charset=noconv は導入して欲しいところです。 実は、4.1.2 では、 1. binary キャラクタセット 2. --init-connect オプション というのが導入されていました。 mysql --default-character-set=binary とすると | client binary | <--> | server ujis | の環境の場合、ORDER BY, LIKE は ujis できちんと扱われます。 クライアントには、文字(バイト列) をそのまま流します。 クライアントが接続してきたときに、最初にクエリを実行するオプションも導入されていました。 サーバー側に、 --init-connect='SET AUTOCOMMIT=0 ; SET NAMES binary' というオプションを与えると、クライアントが接続したときに、自動的に SET AUTOCOMMIT=0 ; SET NAMES binary が実行されます。 ただし、接続するユーザーには「SUPER 権限が無いこと」という条件付きです。 1. libmysqlclient にデフォルトのキャラクタセットが埋め込まれた(4.1.3から) 2. --default-character-set=binary で、noconv の動きが実現できる 3. サーバー側で、自動変換を抑止する方法がある。--init-connect='SET NAMES binary' を使う。 ということで、 A1. サーバーに init-connect をつけて、全ての場合においてクライアントを binary で動かすようにする A2. MS-Win 用のクライアントバイナリ(PHP,Perl等)は、 メンテナに「libmysql は binary でコンパイルして」という要求を上げておく という解決方法で、今までのアプリケーションを書き直すことは少なくなり、 文字が破壊される場合も少なくなったはず。 今後新たにバイナリやアプリを作る場合は、 4.1 を視野に入れて、アプリに SET 文とか入れればいいでしょう。 ただ、client=binary / table(server) = sjis の時、 エスケープ処理がどうなるかは、まだ私の方では未検証です。 MS プラットフォームで動かしている場合、これは避けて通れないので、 検証していただける方が多ければ多いほどたすかります また、クライアントに対する ./configure --with-client-charset=binary ですが、 以下が 4.1.3 前の(今はbitkeeerに入っている)ものに対する簡単なパッチです. またこれが必要な場合ですが、どういう場面で使うでしょうか? 私は次のように考えています 1. 上の mysqld --init-connect をしなくても、設定無しで 4.0, 3.X までと同様に動く 2. デフォルトで文字が壊れるとかのトラブルに遭遇しなくなる 3. バイナリを作成する人が、サーバー用とクライアント用の2回コンパイルする必要が無い 他ありますか? #パッチをMySQLのソースに入れるにしても、説得材料が必要なのです. 以上、宜しくお願い致します ================ 村上毅 takeshi@xxxxxxxxxx ==== パッチ ==== diff -ru mysql-4.1.2-alpha-20040615.orig/include/my_global.h mysql-4.1.2-alpha-20040615-1/include/my_global.h --- mysql-4.1.2-alpha-20040615.orig/include/my_global.h 2004-06-08 16:16:09.000000000 +0900 +++ mysql-4.1.2-alpha-20040615-1/include/my_global.h 2004-06-17 17:50:55.000000000 +0900 @@ -1194,6 +1194,10 @@ #define MYSQL_UNIVERSAL_CLIENT_CHARSET MYSQL_DEFAULT_CHARSET_NAME #endif +#ifndef MYSQL_CLIENT_DEFAULT_CHARSET_NAME +#define MYSQL_CLIENT_DEFAULT_CHARSET_NAME MYSQL_DEFAULT_CHARSET_NAME +#endif + #if defined(EMBEDDED_LIBRARY) && !defined(HAVE_EMBEDDED_PRIVILEGE_CONTROL) #define NO_EMBEDDED_ACCESS_CHECKS #endif diff -ru mysql-4.1.2-alpha-20040615.orig/sql-common/client.c mysql-4.1.2-alpha-20040615-1/sql-common/client.c --- mysql-4.1.2-alpha-20040615.orig/sql-common/client.c 2004-06-11 09:39:19.000000000 +0900 +++ mysql-4.1.2-alpha-20040615-1/sql-common/client.c 2004-06-17 17:50:21.000000000 +0900 @@ -1836,7 +1836,7 @@ /* Set character set */ if (!mysql->options.charset_name && !(mysql->options.charset_name= - my_strdup(MYSQL_DEFAULT_CHARSET_NAME,MYF(MY_WME)))) + my_strdup(MYSQL_CLIENT_DEFAULT_CHARSET_NAME,MYF(MY_WME)))) goto error; { diff -ru mysql-4.1.2-alpha-20040615.orig/config.h.in mysql-4.1.2-alpha-20040615-1/config.h.in --- mysql-4.1.2-alpha-20040615.orig/config.h.in 2004-05-29 04:38:07.000000000 +0900 +++ mysql-4.1.2-alpha-20040615-1/config.h.in 2004-06-17 18:03:08.000000000 +0900 @@ -22,6 +22,8 @@ /* Define the default charset name */ #undef MYSQL_DEFAULT_CHARSET_NAME +#undef MYSQL_CLIENT_DEFAULT_CHARSET_NAME + /* Define the default charset name */ #undef MYSQL_DEFAULT_COLLATION_NAME diff -ru mysql-4.1.2-alpha-20040615.orig/configure.in mysql-4.1.2-alpha-20040615-1/configure.in --- mysql-4.1.2-alpha-20040615.orig/configure.in 2004-06-16 11:34:38.000000000 +0900 +++ mysql-4.1.2-alpha-20040615-1/configure.in 2004-06-17 18:06:21.000000000 +0900 @@ -2332,6 +2332,7 @@ AC_DIVERT_PUSH(0) +define(CHARSETS_AVAILABLE0,binary) define(CHARSETS_AVAILABLE1,ascii armscii8 ascii big5 cp1250 cp1251 cp1256 cp1257) define(CHARSETS_AVAILABLE2,cp850 cp852 cp866 dec8 euckr gb2312 gbk) define(CHARSETS_AVAILABLE3,greek hebrew hp8 keybcs2 koi8r koi8u) @@ -2341,6 +2342,7 @@ DEFAULT_CHARSET=latin1 CHARSETS_AVAILABLE="CHARSETS_AVAILABLE1 CHARSETS_AVAILABLE2 CHARSETS_AVAILABLE3 CHARSETS_AVAILABLE4 CHARSETS_AVAILABLE5" CHARSETS_COMPLEX="big5 cp1250 euckr gb2312 gbk latin1 latin2 sjis tis620 ucs2 ujis utf8" +DEFAULT_CLIENT_CHARSET=binary AC_DIVERT_POP @@ -2355,6 +2357,18 @@ [default_charset="$withval"], [default_charset="$DEFAULT_CHARSET"]) +AC_ARG_WITH(client-charset, + [ --with-client-charset=CHARSET + Default client character set, use one of: + CHARSETS_AVAILABLE0 + CHARSETS_AVAILABLE1 + CHARSETS_AVAILABLE2 + CHARSETS_AVAILABLE3 + CHARSETS_AVAILABLE4 + CHARSETS_AVAILABLE5], + [default_client_charset="$withval"], + [default_client_charset="$default_charset"]) + AC_ARG_WITH(collation, [ --with-collation=COLLATION Default collation], @@ -2671,6 +2685,7 @@ fi AC_DEFINE_UNQUOTED(MYSQL_DEFAULT_CHARSET_NAME,"$default_charset") +AC_DEFINE_UNQUOTED(MYSQL_CLIENT_DEFAULT_CHARSET_NAME,"$default_client_charset") AC_DEFINE_UNQUOTED(MYSQL_DEFAULT_COLLATION_NAME,"$default_collation") MYSQL_CHECK_ISAM
9530 2004-06-03 23:28 [とみたまさひろ <tomm] MySQL 4.1.2 の日本語の扱い 9531 2004-06-04 01:51 ┗[とみたまさひろ <tomm] 9533 2004-06-04 08:26 ┣[SUGAWARA Hajime <sug] 9547 2004-06-07 19:25 ┗[<takeshi@xxxxxxxxxx>] 9550 2004-06-07 21:09 ┣["Ryuichiro Munechika] 9556 2004-06-07 22:02 ┃┗[SUGAWARA Hajime <sug] 9573 2004-06-08 11:51 ┃ ┗[Hirofumi Fujiwara <f] 9586 2004-06-10 02:48 ┃ ┗["HIROSE, Masaaki" <h] 9628 2004-06-13 21:50 ┃ ┗[Hirofumi Fujiwara <f] 9578 2004-06-09 08:05 ┣[とみたまさひろ <tomm] 9580 2004-06-09 09:39 ┃┗[<takeshi@xxxxxxxxxx>] 9592 2004-06-11 05:04 ┗[<shuichi@xxxxxxxxxx>] 9596 2004-06-11 11:00 ┣[<shuichi@xxxxxxxxxx>] 9598 2004-06-12 00:16 ┗[<takeshi@xxxxxxxxxx>] 9611 2004-06-12 21:55 ┗[とみたまさひろ <tomm] -> 9687 2004-06-18 09:40 ┗[<takeshi@xxxxxxxxxx>] 9699 2004-06-23 09:41 ┣[<takeshi@xxxxxxxxxx>] 9728 2004-07-01 11:18 ┗[<takeshi@xxxxxxxxxx>] 9756 2004-07-02 21:14 ┗[<takeshi@xxxxxxxxxx>] 9808 2004-07-10 16:55 ┗[<takeshi@xxxxxxxxxx>] 9839 2004-07-13 14:26 ┗[Shuichi Tamagawa <sh] 9842 2004-07-13 15:12 ┣[Hirofumi Fujiwara <f] 9848 2004-07-14 09:35 ┃┗[<shuichi@xxxxxxxxxx>] 9850 2004-07-14 09:56 ┃ ┗[<takeshi@xxxxxxxxxx>] 9852 2004-07-14 12:25 ┃ ┗[Hirofumi Fujiwara <f] 9854 2004-07-14 13:39 ┃ ┣[<takeshi@xxxxxxxxxx>] 9858 2004-07-14 15:31 ┃ ┃┗[Hirofumi Fujiwara <f] 9860 2004-07-14 16:35 ┃ ┃ ┣[<takeshi@xxxxxxxxxx>] 9867 2004-07-16 02:16 ┃ ┃ ┗[Shuichi Tamagawa <sh] 9863 2004-07-15 11:34 ┃ ┗[<shuichi@xxxxxxxxxx>] 9847 2004-07-14 08:52 ┗[<shuichi@xxxxxxxxxx>] 9849 2004-07-14 09:39 ┗[<takeshi@xxxxxxxxxx>]