- ベストアンサー
varcharのMは文字数かバイト数か?
- varchar属性にvarchar(10)と指定すると10文字入ると思っていたのですが、全角で入力すると5文字、半角で10文字でした。
- マニュアル6.2のカラム型によると、M の範囲は 0 〜 255 文字とあります。
- LONGだけが「バイト」という表現、それ以外はvarcharも含めて文字数という表現なので、当然文字数でカウントしていると思っていたので完全に計算が狂いました。これはマニュアルが間違えているのでしょうか?それとも、文字コードによって変わるのでしょうか?MySQLでどの文字コードが使用されているかどこを見れば分かるのですか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>百歩譲って間違いではないとしても、著しく不備があるとは言えますね。 翻訳されたものなら仕方ないと思います。でも、確かに少しくらい注釈が有った方が親切かもしれませんね。 >これは使用する文字コードによって変わるのでしょうか? >その場合、どの文字コードがバイト換算でどの文字コードが文字数換算なのでしょうか? 同じ文字コード内でも文字によって必要とされるバイト数が違いますから、マニュアルで文字単位で記されている物をバイトで考えた方がいいと思います。 255文字→255バイト MySQLでの文字コード確認方法はこちら。 http://www.javadrive.jp/mysql/control/index1.html 参考URLは文字コードについてのページです。
- 参考URL:
- http://ash.jp/code/code.htm
その他の回答 (1)
- taskuni
- ベストアンサー率71% (49/69)
文字数というのは、半角文字(1バイト文字)を基本に考えて解説がされていると思います。マニュアルに間違いは無いと思います。 日本語を使うのであれば、倍の領域を確保することを考えてデータベースを作らないといけません。
補足
1バイト=1文字という狭義的な解釈に対し何の注釈も振ってないこと自体、マニュアルの不具合ですね。 それに、既に書いたようにLONGだけが「バイト」という表現、それ以外はvarcharも含めて「文字数」という表現であることからさらに解釈を難解にしている。 もはやこれは間違いと言っても過言ではないです。 百歩譲って間違いではないとしても、著しく不備があるとは言えますね。 間違い間違いでないの話は、これで終わりとして、 これは使用する文字コードによって変わるのでしょうか? その場合、どの文字コードがバイト換算でどの文字コードが文字数換算なのでしょうか? また、MySQLでどの文字コードが使用されているかどこを見れば分かるのですか?
補足
>翻訳されたものなら仕方ないと思います。でも、確かに少しくらい注釈が有った方が親切かもしれませんね。 念の為に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=バイト数みたいですね。。