2012-05-01 132 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的,你必須使用這樣的事情:

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

更新現有列「爲nvarchar(最大)」。這是正確的,因爲我得到:

「行大小太大,使用的表型的最大行大小」如果我使用:

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

工作的事情,但我不能確定這是否實現mysql中的'nvarchar(max)'。

回答

2

the manual解釋:

每個表(無論存儲引擎的)具有65535個字節的最大行大小。存儲引擎可能會對此限制添加其他約束,從而減少有效的最大行大小。

由於所有列的總長度不能超過此大小,因此最大行大小限制了列的數量(以及可能的大小)。例如,utf8字符每個字符最多需要三個字節,因此對於CHAR(255) CHARACTER SET utf8列,服務器必須爲每個值分配255×3 = 765個字節。因此,一個表不能包含超過65,535/765 = 85個這樣的列。

可變長度列的存儲包括長度字節,這是根據行大小進行評估的。例如,VARCHAR(255) CHARACTER SET utf8列需要兩個字節來存儲值的長度,因此每個值最多可能需要767個字節。

因此,您必須考慮表中存在其他列,並計算此VARCHAR可用的最大大小。

但是,如果您需要空間來存放長文本值,爲什麼不使用TEXT數據類型,這些數據類型不受此限制的約束(除了它們對其貢獻的9到12個字節)?

+0

謝謝你有道理。對不起,這是無知的註冊。 MySQL的。雖然有點奇怪。想象一下,我想在未來添加一列(不是不合理的情況),我已經超過了65535字節。這意味着我必須可能會丟失數據... – cs0815

+0

剛剛看到TEXT位有點遺憾。必須考慮如何告訴nhibernate使用這個。是否有可能將現有的varchar更新爲文本?謝謝。 – cs0815

+0

@csetzkorn:是的,只是'ALTER TABLE sometable MODIFY bla TEXT;' – eggyal