プロが教える店舗&オフィスのセキュリティ対策術

os:ターボlinuxです。

varchar属性にvarchar(10)と指定すると10文字入ると思っていたのですが、全角で入力すると5文字、半角で10文字でした。

マニュアル6.2のカラム型によると、
M の範囲は 0 〜 255 文字とあります。

TINYBLOB , TINYTEXT は最大長が 255(2^8 - 1)文字
BLOB , TEXTは 最大長が 65535(2^16 - 1)文字
MEDIUMBLOB , MEDIUMTEXTは 最大長が 16777215(2^24 - 1)文字

そして
LONGBLOB , LONGTEXT は最大長が 4294967295 または 4G(2^32 - 1)バイト

となっています。

LONGだけが「バイト」という表現、それ以外はvarcharも含めて文字数という表現なので、当然文字数でカウントしていると思っていたので完全に計算が狂いました。


これはマニュアルが間違えているのでしょうか?

それとも、文字コードによって変わるのでしょうか?
その場合、どの文字コードがバイト換算でどの文字コードが文字数換算なのでしょうか?
また、MySQLでどの文字コードが使用されているかどこを見れば分かるのですか?

となたかご教授下さい。

A 回答 (2件)

>百歩譲って間違いではないとしても、著しく不備があるとは言えますね。


翻訳されたものなら仕方ないと思います。でも、確かに少しくらい注釈が有った方が親切かもしれませんね。

>これは使用する文字コードによって変わるのでしょうか?
>その場合、どの文字コードがバイト換算でどの文字コードが文字数換算なのでしょうか?
同じ文字コード内でも文字によって必要とされるバイト数が違いますから、マニュアルで文字単位で記されている物をバイトで考えた方がいいと思います。
255文字→255バイト

MySQLでの文字コード確認方法はこちら。
http://www.javadrive.jp/mysql/control/index1.html

参考URLは文字コードについてのページです。

参考URL:http://ash.jp/code/code.htm

この回答への補足

>翻訳されたものなら仕方ないと思います。でも、確かに少しくらい注釈が有った方が親切かもしれませんね。

念の為にen版を見てみました。
英語は解らないですけどlengthという表現しか用いていないので完全に誤訳ですね。

The length can be any value from 0 to 255.
「長さは0から255の範囲を如何様(いかよう)にも指定可能」
と直訳すれば良かったのですが、
「範囲は 0 ~ 255 文字」
と誤った意訳をしたみたいですね。
翻訳はコンピュータ知識のない人がする場合もありますから、コンピュータ知識のある人が指摘してあげないといけませんね。
「タダのものだから仕方ない」とスルーする気持ちが訂正するチャンスを奪っているのでしょうね。。


それはさておき、

>参考URLは文字コードについてのページです。

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

ServerとClientの文字セットを確認するとlatin1(西欧)でした。

Server characterset: latin1
Client characterset: latin1

これを

Server characterset: sjis
Client characterset: sjis

にしたり

Server characterset: ujis
Client characterset: ujis

にしたりして

create table tb1 (it1 varchar(4));
insert into tb1 values ( 'ああああ' );
select * from tb1;

を試しましたが、いずれも結果は

+------+
| it1 |
+------+
| ああ |
+------+

でした。

文字セットとは無関係に常にvarchar(M) の M=バイト数みたいですね。。

補足日時:2005/11/16 10:18
    • good
    • 0

文字数というのは、半角文字(1バイト文字)を基本に考えて解説がされていると思います。

マニュアルに間違いは無いと思います。

日本語を使うのであれば、倍の領域を確保することを考えてデータベースを作らないといけません。

参考URL:http://www.pc-view.net/Help/manual/0082.html

この回答への補足

1バイト=1文字という狭義的な解釈に対し何の注釈も振ってないこと自体、マニュアルの不具合ですね。

それに、既に書いたようにLONGだけが「バイト」という表現、それ以外はvarcharも含めて「文字数」という表現であることからさらに解釈を難解にしている。

もはやこれは間違いと言っても過言ではないです。

百歩譲って間違いではないとしても、著しく不備があるとは言えますね。

間違い間違いでないの話は、これで終わりとして、

これは使用する文字コードによって変わるのでしょうか?
その場合、どの文字コードがバイト換算でどの文字コードが文字数換算なのでしょうか?
また、MySQLでどの文字コードが使用されているかどこを見れば分かるのですか?

補足日時:2005/11/15 00:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!