mysql 大小限制_关于sql:MySQL:列大小限制
我目前正在開(kāi)發(fā)Windows操作系統(tǒng),我已經(jīng)安裝了MySQL社區(qū)服務(wù)器5.6.30,一切都很好。我有一個(gè)初始化數(shù)據(jù)庫(kù)的腳本,并且一切正常。
現(xiàn)在我正在嘗試在Linux環(huán)境中運(yùn)行此腳本 - 相同的MySQL版本 - 我收到以下錯(cuò)誤:
ERROR 1074 (42000) at line 3: Column length too big for column
'txt' (max = 21845); use BLOB or TEXT instead
劇本-
顯然我的Windows操作系統(tǒng)上有一些我需要在Linux上復(fù)制的MySQL服務(wù)器配置;誰(shuí)能分享想法?
更新1
在AWS的RDS上它也可以工作,并且非常確定它只是Linux之上的一項(xiàng)服務(wù),因此顯然只是配置問(wèn)題。
有沒(méi)有人知道如何用UTF8達(dá)到varchar 50k?我不想使用TEXT或MEDIUMTEXT或其他任何東西,只是普通的舊varchar(大小)
更新2
我很欣賞所提出的不同的解決方案,但我不尋找新的解決方案我只是尋找答案,為什么varchar(50k)在Windows下工作,在linux下它沒(méi)有。
順便說(shuō)一句,我使用字符集UTF8和collat??ion utf8_general_ci。
回答
回答我自己的問(wèn)題,這是它設(shè)置的SQL_MODE的一個(gè)問(wèn)題
STRICT_TRANS_TABLES,應(yīng)該已被刪除。
我個(gè)人認(rèn)為50k的" varchar"太長(zhǎng),無(wú)論如何應(yīng)為text。
stackoverflow.com/questions/25300821/
@NiettheDarkAbsol我不想使用文本,我希望它作為varchar起作用。
@SanoojT感謝參考,但它無(wú)關(guān)
@TalBenShabtay為什么? Varchar不是正確的工具。
@NiettheDarkAbsol,因?yàn)樗赪indows下工作,我想知道為什么在Windows下不能工作。
你想知道為什么錯(cuò)誤的工具在一個(gè)地方而不是另一個(gè)地方工作? 因?yàn)樗清e(cuò)誤的工具!
根據(jù)文件:
Although InnoDB supports row sizes larger than 65,535 bytes
internally, MySQL itself imposes a row-size limit of 65,535 for the
combined size of all columns:
mysql> CREATE TABLE t (a VARCHAR(8000), b VARCHAR(10000),
-> c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
-> f VARCHAR(10000), g VARCHAR(10000)) ENGINE=InnoDB;
ERROR 1118 (42000): Row size too large. The maximum row size for the
used table type, not counting BLOBs, is 65535. You have to change some
columns to TEXT or BLOBs
(不幸的是,這個(gè)例子沒(méi)有提供字符集,所以我們真的不知道列有多大。)
utf8編碼每個(gè)字符使用1個(gè),2個(gè)或3個(gè)字節(jié)。因此,可以安全地容納在65,535字節(jié)的頁(yè)面中的最大字符數(shù)(MySQL最大值)為21,845個(gè)字符(21,845 * 3 = 65,535)。
盡管版本相似,但似乎Windows的空間分配保守,并保證您可以在該字段中存儲(chǔ)任何字符。 Linux似乎更放任自流。您可以存儲(chǔ)一些超過(guò)21,845個(gè)字符的字符串,具體取決于字符。
我不知道為什么在同一版本中會(huì)存在這種差異。在某種意義上,這兩種方法都是"正確的"。有足夠簡(jiǎn)單的解決方法:
使用TEXT。
切換到具有較短字符(可能是您要存儲(chǔ)的字符)的排序規(guī)則。
減小字段的大小。
你知道的任何整理可能會(huì)支持我需要的尺寸嗎?另外,請(qǐng)查看更新1
看一個(gè)工作的RDS設(shè)置是相同的,UTF8和utf8_general_ci整理,所以我不明白為什么它不起作用。
@TalBenShabtay。 。 。"拉丁"排序規(guī)則最多只有一個(gè)字節(jié)。您可以在此處查看文檔:dev.mysql.com/doc/refman/5.7/en/charset-mysql.html。
utf8每個(gè)字符最多需要3個(gè)字節(jié)。 utf8mb4:4; latin1:1; ascii:1; VARCHAR(N)被實(shí)現(xiàn)為文本字節(jié)前面1或2字節(jié)的長(zhǎng)度。允許保留N個(gè)字符(不是字節(jié))。所以,如果你說(shuō)你想要utf8,那么3 * N必須小于65535,這是2字節(jié)長(zhǎng)度的最大值。
很高興您沒(méi)有在某些舊版本中運(yùn)行,其中VARCHAR的限制為255。
如果txt不需要ascii或英文以外的字符,請(qǐng)使用CHARACTER SET latin1。
在InnoDB中,當(dāng)存在"長(zhǎng)"字段(大varchars,文本,blob等)時(shí),部分或全部列存儲(chǔ)在單獨(dú)的塊中。對(duì)于記錄中存儲(chǔ)的內(nèi)容,存在大約8000字節(jié)的限制。
如果您確實(shí)需要50K的utf8,則需要MEDIUMTEXT。它使用3字節(jié)長(zhǎng)度,最多可容納16M字節(jié)(5M字符,可能更多,因?yàn)閡tf8是可變長(zhǎng)度編碼)。
大多數(shù)應(yīng)用程序可以(應(yīng)該?)使用ascii(每個(gè)字符1個(gè)字節(jié))或utf8mb4(每個(gè)字符1-4個(gè)字節(jié))。后者允許使用所有語(yǔ)言,包括表情符號(hào)和utf8無(wú)法處理的4字節(jié)中文字符。
至于為什么Windows和Linux在這里工作有所不同,我不知道。你使用的是同一個(gè)版本嗎?建議您通過(guò)http://bugs.mysql.com提交錯(cuò)誤報(bào)告。 (并提供此問(wèn)題的鏈接。)
請(qǐng)簡(jiǎn)單地使用TEXT聲明txt列
mysql varchar max size,你可以在之前的stackoverflow.com/questions/13506832/上查看它
無(wú)關(guān)的。我想使用varchar而不是TEXT
了解。我想知道為什么你可以在Windows OS上的MySQL中的utf8中添加varchar(50000)varchar的最大長(zhǎng)度是65535,參考dev.mysql.com/doc/refman/5.6/en/column-count-limit.html劃分通過(guò)字符集中字符集的最大字節(jié)長(zhǎng)度將列設(shè)置為(utf8 = 3字節(jié),ucs2 = 2,latin1 = 1)。因此您的案例的最大varchar錯(cuò)誤為65535/3 = 21845
如果你絕對(duì)必須使用varchar - 這是解決這個(gè)問(wèn)題的一個(gè)不好的方法! - 那么這是你可以嘗試的東西:
有50000個(gè)字符。現(xiàn)在,您的客戶端應(yīng)用程序?qū)⒈仨毠芾韺⑽谋静鸱殖蓡为?dú)的塊,并在每個(gè)表中創(chuàng)建記錄。同樣,重新閱讀文本將要求您執(zhí)行3個(gè)選擇語(yǔ)句,但您將擁有50000個(gè)字符。
完全不建議在任何數(shù)據(jù)庫(kù)實(shí)現(xiàn)中執(zhí)行此操作。
我曾經(jīng)在一些環(huán)境中工作,在這些環(huán)境中,大型文本存儲(chǔ)在數(shù)據(jù)庫(kù)的列中,并且它總是會(huì)導(dǎo)致比解決的問(wèn)題更多的問(wèn)題。
這些應(yīng)該真正假脫機(jī)到磁盤(pán)上的文件,以及對(duì)存儲(chǔ)在數(shù)據(jù)庫(kù)中的文件的完整路徑的引用。
然后對(duì)該文檔集運(yùn)行一些索引引擎。
這樣您將獲得更大的可伸縮性,并且管理起來(lái)更加輕松。
謝謝,但我不是在尋找一個(gè)不同的解決方案。即時(shí)尋找答案為什么在Windows中它工作正常,在Linux上它沒(méi)有。而已 。
總結(jié)
以上是生活随笔為你收集整理的mysql 大小限制_关于sql:MySQL:列大小限制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ansible 安装 mysql 案例记
- 下一篇: 笛卡尔乘积问题