StringPropertyの最大サイズ

こちらのドキュメントによると「StringPropertyに入れられる文字列は500byteまで」と書いてます。500byteと言われても、文字コードによって一文字あたりのサイズは違うしなあ。
というわけで実験してみました。

このページで適当な文字列を入力して……

<html>
	<head>
		<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
	</head>
	<body>
		<form action="/submit" method="POST">
			<input type="text" name="the_text">
			<input type="submit">
		</form>
	</body>
</html>

こっちのコードでStringPropertyの中に突っ込んでみます。

import wsgiref.handlers
from google.appengine.ext import webapp
from google.appengine.ext import db

class MyString(db.Model):
	str = db.StringProperty()

class SubmitPage(webapp.RequestHandler):
	def post(self):
		obj = MyString()
		obj.str = self.request.get('the_text')
		obj.put()
		obj2 = db.get(obj.key())
		self.response.out.write(obj2.str)

wsgiref.handlers.CGIHandler().run(webapp.WSGIApplication([('/submit', SubmitPage)]))

これらをGAEサーバにアップロードして、実験。

  • '0'を500文字入力 → 正常
  • '0'を500文字入力 → 500 ERROR

妥当ですよね。
さて、ここで「あ」を限界まで入力しますが、何文字まで入力できるでしょうか? EUC-JPやSHIFT_JISだと「あ」は2bytes、UTF-16でも2bytes、UTF-8だと3bytesです。

答は……

  • 'あ'を500文字入力 → 正常
  • 'あ'を501文字入力 → 500 ERROR

あっるぇぇぇ?

正解は、どうやら「StringPropertyには(500bytesではなくて)500文字を格納することができる」のようです。
ドキュメントの修正が必要なんじゃない?とMLに投げておきました。