2012-05-01 16 views
0

私は本当に問題ではなかったSQL Server 2005からmysqlに切り替えました。mysql流暢nhibernate問題nvarchar

SQL Serverに存在する(n)varcharに若干の問題があります。通常私は使用しました:

mapping.Map(x => x.bla).Length(10000); 

blaをnvarchar(max)に設定しました。これはmysqlで動作しますか?私は、MySQLにはnvarchar型が存在しないと信じて、あなたはこのようなものを使用する必要があります:「データ型はnvarchar(MAX)」への既存の列を更新する

alter table sometable modify bla VARCHAR(21844) CHARACTER SET utf8 

を。私は

「使用テーブル型の最大行サイズ行のサイズが大きすぎます。」使用しています

場合::私は取得していますので、この正しい

alter table sometable modify bla VARCHAR(1000) CHARACTER SET utf8 

物事が動作しますが、私はないですこれがmysqlで 'nvarchar(max)'を達成するかどうかを確かめてください。

答えて

2

としてはthe manualで説明:

すべてのテーブルを(関係なく、ストレージエンジンの)65,535バイトの最大行サイズを有します。ストレージエンジンは、この制限に追加の制約を課すことがあり、実効最大行サイズを縮小します。

最大行サイズは、すべての列の合計長がこのサイズを超えることができないため、列の数(および場合によってはサイズ)を制限します。たとえば、utf8の文字は1文字あたり最大3バイト必要なので、CHAR(255) CHARACTER SET utf8の列の場合、サーバーは値ごとに255×3 = 765バイトを割り当てる必要があります。したがって、テーブルには65,535/765 = 85個以上のカラムを含めることはできません。

可変長列の記憶域には、行サイズに対して評価される長さバイトが含まれます。たとえば、VARCHAR(255) CHARACTER SET utf8列は値の長さを格納するために2バイトを要します。したがって、各値は767バイトまでとなります。

したがって、テーブルに他のどの列が存在するかを検討し、VARCHARの最大サイズを計算する必要があります。

ただし、長いテキスト値のスペースが必要な場合は、TEXTのデータ型を使用してください。このデータ型は、この制限によって制約されません(9〜12バイトは除外されます)。

+0

ありがとうございます。とても無知なことに申し訳ありません。 mysql。しかし、奇妙なビット。将来的に(不合理な状況ではなく)列を追加したいとしたら、65,535バイトを最大にしました。これは、私が潜在的にデータを失う必要があることを意味します... – cs0815

+0

ちょうどテキストビットを見た申し訳ありません。これを使うにはnhibernateにどのように伝えるべきか考えなければならない。既存のvarcharをテキストに更新することは可能ですか?ありがとう。 – cs0815

+0

@csetzkorn:はい、単に 'ALTER TABLE sometableを変更するbla TEXT;' – eggyal