ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

MySQLコミュのひらがな1文字だとヒットしない?

  • mixiチェック
  • このエントリーをはてなブックマークに追加
どうにも府に落ちない事が起こっているのでどなたか知っていたら教えて欲しいのですが

varchar のフィールドにひらがな1文字だけ入っているテーブルが2つあります。

こんな感じです。
create table aaa ( wd1 varchar(2) );
create table bbb ( wd1 varchar(2) );

さて、このテーブルに「あ」〜「ん」まで1文字づつ順に登録して行きます。

で、
SELECT * FROM aaa, bbb WHERE aaa.wd1 = bbb.wd1;
こんなことをすると、普通なら、aaa.wd1 = bbb.wd1 という条件にマッチしたレコードが出てきますが
ウチの環境では

| た | た |
| ち | ち |
| む | ち |
| め | ち |
| も | ち |
| つ | つ |
| て | つ |
| や | つ |
| ゆ | つ |
| つ | て |
| て | て |
| や | て |
| ゆ | て |
| と | と |
| な | と |
| に | と |
| よ | と |
| ら | と |
| り | と |
| る | と |

とかいう結果になります。
DB内のレコードどうしなので、文字コードがっていうのも違うかなぁと思っています。

また、ブラウザ等を通していないので、他のアプリの影響があるとも思いにくく、回避策を求めて、右往左往しています。

これはなぜこんなことになるのでしょうか?
また、回避策があればご教授くださいますようお願いします。

なお、環境は
FreeBSD 5.4-STABLE
Mysql 4.1.16

で、ターミナル上から mysql コマンドで実行しています。
ちなみに文字コードはEUC-JPです。

よろしくお願い致します。

コメント(7)

文字コードの関係なのか、uniqueなindexのある項目に日本語を登録する際に、重複エラーが出たことがありました。どーやら、別の文字を同一の文字としてindexを張られてしまっていたようです。
# たしか、ラテン-1とかに、euc-jpをいれてた・・・
 DB内のレコード同士であっても、テーブルもしくは項目に定義している文字コードと違う文字コードのデータを無理やり入れている場合は影響がありそうです。
# なので、EUC-JPにでも統一して確認してみてください。
↓やってみる価値はあるかも
SELECT aaa.wd1,bbb.wd1,HEX(aaa.wd1),HEX(bbb.wd1) FROM aaa, bbb WHERE aaa.wd1 = bbb.wd1;
% uname -a
FreeBSD go.sakuma.ne.jp 5.4-RELEASE-p7 FreeBSD 5.4-RELEASE-p7 #0: Sun Sep 18 03:23:48 GMT 2005 root@zero.sakuma.ne.jp:/usr/obj/usr/src/sys/BitCoffee2005091801 i386

% mysql --version
mysql Ver 12.22 Distrib 4.0.24, for portbld-freebsd5.4 (i386)

という環境で試してみました.

SQL文は,


CREATE TABLE aaa (
wd1 VARCHAR(2)
);

CREATE TABLE bbb (
wd1 VARCHAR(2)
);

INSERT INTO aaa (
wd1
) VALUES (
"あ"
), (
"い"
), (
"う"
), (
"え"
), (
"お"
), (
"か"
), (
"き"
), (
"く"
), (
"け"
), (
"こ"
);

INSERT INTO bbb (
wd1
) VALUES (
"あ"
), (
"い"
), (
"う"
), (
"え"
), (
"お"
), (
"か"
), (
"き"
), (
"く"
), (
"け"
), (
"こ"
);


長いのでちょっと割愛.

漢字コードはEUC-JPです.


mysql> SELECT * FROM aaa,bbb WHERE aaa.wd1 = bbb.wd1;
+------+------+
| wd1 | wd1 |
+------+------+
| あ | あ |
| い | い |
| う | う |
| え | え |
| お | お |
| か | か |
| き | き |
| く | く |
| け | け |
| こ | こ |
+------+------+
10 rows in set (0.00 sec)
追伸です.

% uname -a
FreeBSD go.bitcoffee.net 6.0-RELEASE-p4 FreeBSD 6.0-RELEASE-p4 #0: Wed Feb 22 06:25:31 UTC 2006 bitcoffee@go.bitcoffee.net:/usr/obj/usr/src/sys/BitCoffee2006022201 i386


% mysql --version
mysql Ver 14.12 Distrib 5.0.18, for portbld-freebsd6.0 (i386) using 5.0


mysql> SELECT * FROM aaa,bbb WHERE aaa.wd1 = bbb.wd1;
+------+------+
| wd1 | wd1 |
+------+------+
| あ | あ |
| い | い |
| う | う |
| え | え |
| お | お |
| か | か |
| き | き |
| く | く |
| け | け |
| こ | こ |
+------+------+
10 rows in set (0.00 sec)
INSERTする際に,--default-character-set=ujisをやるとうまくいきません.

サーバ,クライアントともlatin1の環境だと上記のようにうまくいきます.

ソートや,変換などをMySQLに望まず,プログラム側で実装してしまうなら,キャラクターセットはlatin1のまま入れてしまうのが,一番簡単です.
無変換なので,単なるバイナリとして取り扱ってくれます.
# WHEREやLIKEはちゃんと動作します


ソートや,任意のキャラクターセットへの変換をMySQLに望むなら,utf8がいいのではないでしょうか?

最近は,Javaと連携させることが多いので,もっぱらutf8に頼ってます.


あと,FreeBSDのportsからMySQL入れると,ujis当たりはデフォで入りませんからね.
make install cleanの際に,

WITH_XCHARSET=all

が必要です.
さらについでなので.

CREATE TABLE aaa (
wd1 VARCHAR(2)
) DEFAULT CHARSET=ujis;

CREATE TABLE bbb (
wd1 VARCHAR(2)
) DEFAULT CHARSET=ujis;


でテーブルを作った場合は,

% mysql -u hogehoge foobar --default-character-set=ujis

でも正常に動作しました.
レスありがとうございます。

基本的には、ターミナルの文字コードが違うのが良くなかったんですね。
で、MySQLの内部文字コードを調べたら、やっぱり、latn1でした。これを、EUC-JPのターミナルで動かすから、よけいな文字コード変換が起こってたのですね。
ナットクしました。

>SELECT aaa.wd1,bbb.wd1,HEX(aaa.wd1),HEX(bbb.wd1) FROM aaa, bbb WHERE aaa.wd1 = bbb.wd1;
これは効果がありました!
正しくヒットするようになりました。
でも、1文字の場合にしか効かない(TT)
ま、1文字だから、いいんですけどね。

テーブルの定義を変更するのも試してみたかったんですが、
サーバーの管理権限をもっていないので、試せませんでした。

でも、きっとMySQLの内部の文字コードとか、その他いろいろの文字コードを全部同じにすると、正しく動くんでしょう。


これで先に進める気がします。
いろいろ、ありがとうございました。

また、何か有りましたときにはよろしくお願い致します。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

MySQL 更新情報

MySQLのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング