2009年4月18日

[mysql 14810] Re: SJISで文字コードがシフト?してしまい検索できない

立岡です。

ソースコード眺めてみたらおかしなところを発見しました。
ようするにUPPERとLOWERがlatin1と同じ関数が使われているようです。
これをマルチバイト用の関数に直したらうまく動きました。
(この関数がcp932とsjisに対応しているという前提ですが。。。)
動作は下記です。そのあとパッチです。
cp932だけでなくsjisもコードがおかしいようです。


mysql> show create table t;
+-------+-----------------------------------------------------------------------------------------+
| Table | Create Table
|
+-------+-----------------------------------------------------------------------------------------+
| t | CREATE TABLE `t` (
`a` varchar(16) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp932 |
+-------+-----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT a, HEX(a), HEX(UPPER(a)) FROM t;
+--------+----------+---------------+
| a | HEX(a) | HEX(UPPER(a)) |
+--------+----------+---------------+
| ビタ | 8372835E | 8372835E |
| ABC | 414243 | 414243 |
| abc | 616263 | 414243 |
+--------+----------+---------------+
3 rows in set (0.02 sec)

mysql> select * from t WHERE upper(a)="ビタ";
+--------+
| a |
+--------+
| ビタ |
+--------+
1 row in set (0.00 sec)

mysql> select * from t WHERE upper(a)="コタ";
Empty set (0.00 sec)


パッチ
--- mysql-5.0.77-org/strings/ctype-cp932.c 2009-01-30 06:45:47.000000000
+0900
+++ mysql-5.0.77-new/strings/ctype-cp932.c 2009-04-18 12:34:32.000000000
+0900
@@ -5485,10 +5485,10 @@
my_numcells_cp932,
my_mb_wc_cp932, /* mb_wc */
my_wc_mb_cp932, /* wc_mb */
- my_caseup_str_8bit,
- my_casedn_str_8bit,
- my_caseup_8bit,
- my_casedn_8bit,
+ my_caseup_str_mb,
+ my_casedn_str_mb,
+ my_caseup_mb,
+ my_casedn_mb,
my_snprintf_8bit,
my_long10_to_str_8bit,
my_longlong10_to_str_8bit,
satoshi@xxxxx:~/Downloads$ diff -u mysql-5.0.77-org/strings/ctype-sjis.c
mysql-5.0.77-new/strings/ctype-sjis.c
--- mysql-5.0.77-org/strings/ctype-sjis.c 2009-01-30 06:45:48.000000000
+0900
+++ mysql-5.0.77-new/strings/ctype-sjis.c 2009-04-18 12:35:00.000000000
+0900
@@ -4648,10 +4648,10 @@
my_numcells_sjis,
my_mb_wc_sjis, /* mb_wc */
my_wc_mb_sjis, /* wc_mb */
- my_caseup_str_8bit,
- my_casedn_str_8bit,
- my_caseup_8bit,
- my_casedn_8bit,
+ my_caseup_str_mb,
+ my_casedn_str_mb,
+ my_caseup_mb,
+ my_casedn_mb,
my_snprintf_8bit,
my_long10_to_str_8bit,
my_longlong10_to_str_8bit,


投稿者 xml-rpc : 2009年4月18日 13:37
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/84402
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。