MySQL VARCHAR maksimum boyutu nedir?


300

Bir MySQL VARCHAR türü için maksimum boyutun ne olduğunu bilmek istiyorum.

Maksimum boyutun yaklaşık 65k olan satır boyutu ile sınırlı olduğunu okudum. Alanı ayarlamayı denedim varchar(20000)ama çok büyük olduğunu söylüyor.

Bunu ayarlayabilirim varchar(10000). Bunu ayarlayabileceğim tam maksimum değer nedir?


1
Ayrıntılı bir blog: goo.gl/Hli6G3
Suresh Kamrushi

Yanıtlar:


293

MySQL'in maksimum satır boyutu sınırına sahip olduğunu unutmayın

MySQL tablosunun dahili temsili, BLOB ve TEXT türlerini hesaba katmadan maksimum 65.535 bayt satır sınırına sahiptir. BLOB ve TEXT sütunları, içerikleri satırın geri kalanından ayrı olarak depolandığından, satır boyutu sınırına yalnızca 9 ila 12 bayt katkıda bulunur. Tablo Sütunu Sayımı ve Satır Boyutu Sınırları hakkında daha fazla bilgi edinin .

Tek bir sütunun kaplayabileceği maksimum boyut, MySQL 5.0.3'ten önce ve sonra farklıdır

VARCHAR sütunlarındaki değerler değişken uzunluklu dizelerdir. Uzunluk, MySQL 5.0.3'ten önce 0 ila 255 ve 5.0.3 ve sonraki sürümlerde 0 ila 65.535 arasında bir değer olarak belirtilebilir . MySQL 5.0.3 ve sonraki sürümlerde VARCHAR'ın etkin maksimum uzunluğu, maksimum satır boyutuna (tüm sütunlar arasında paylaşılan 65.535 bayt) ve kullanılan karakter kümesine tabidir.

Ancak, utf8 veya utf8mb4 gibi bir çok baytlık karakter kümesi kullanırsanız sınırın daha düşük olduğunu unutmayın.

TEXTSatır boyutu sınırını aşmak için türleri kullanın .

Dört METİN türü TINYTEXT, TEXT, MEDIUMTEXT ve LONGTEXT'dir. Bunlar dört BLOB tipine karşılık gelir ve aynı maksimum uzunluklara ve depolama gereksinimlerine sahiptir.

BLOB ve METİN Türleri Hakkında Daha Fazla Bilgi

Hatta daha fazla

Tüm veri türleri için depolama gereksinimlerini ele alan Veri Türü Depolama Gereksinimleri hakkında daha fazla bilgi edinin .


4
"uzun" dize nedir?
Richard H

6
TEXT sütunlarından kaçınmaya çalışıyorum, ancak mevcut ve sıralama sırasında geçici tabloların oluşturulmasına neden olabilirler
Robert Swisher

1
Ben ilk isim için varchar (200) almak ve bu alanda sadece 6 karakter depolamak o zaman kaç bayt adı işgal olacak?
Paresh Gami

2
@PareshGami - 6 + 1 = 7 karakter! CHAR'ın aksine, VARCHAR değerleri 1 bayt veya 2 bayt uzunluğunda önek artı veri olarak depolanır. devamı ...
rajukoyilandy

58

Gereğince çevrimiçi dokümanlar , bir 64K satır sınırı vardır ve siz kullanarak satır boyutunu çalışabilir:

row length = 1
             + (sum of column lengths)
             + (number of NULL columns + delete_flag + 7)/8
             + (number of variable-length columns)

Sütun uzunluklarının boyutlarının bire bir eşleşmesi olmadığını unutmayın. Örneğin, CHAR(10) CHARACTER SET utf8belirli bir kodlamanın karakter başına üç bayt başına özelliğini hesaba katması gerektiğinden, on karakterin her biri için üç bayt gerektirir utf8(bu, en fazla dört bayta sahip olabilen "gerçek" UTF-8 yerine MySQL'in utf8kodlamasıdır. ).

Ancak, satır boyutunuz 64K'ya yaklaşıyorsa, veritabanınızın şemasını incelemek isteyebilirsiniz. Düzgün ayarlanmış (3NF) bir veritabanında bu kadar geniş olması gereken nadir bir tablodur - mümkündür, çok yaygın değildir.

Bundan daha fazlasını kullanmak isterseniz, BLOBveya TEXTtürlerini kullanabilirsiniz . Bunlar satırın 64K sınırına dahil değildir (küçük bir yönetimsel ayak izi dışında), ancak kullanımlarından kaynaklanan, metin bloğunun tamamını belirli bir sayının ötesinde sıralayamamak gibi diğer sorunların farkında olmanız gerekir. (bu, yukarı doğru yapılandırılabilir), geçici tabloları bellekte değil diskte olmaya zorlamak veya boyutları ve verimli iletişim için arabellekleri yapılandırmak zorunda kalmaktır.

İzin verilen boyutlar:

TINYTEXT          255 (+1 byte  overhead)
TEXT          64K - 1 (+2 bytes overhead)
MEDIUMTEXT    16M - 1 (+3 bytes overhead)
LONGTEXT      4G  - 1 (+4 bytes overhead)

Hala bayt / karakter uyumsuzluğu var (böylece bir MEDIUMTEXT utf8sütun "sadece" yaklaşık yarım milyon karakter depolayabilir (16M-1)/3 = 5,592,405), ancak yine de aralığınızı büyük ölçüde genişletir.


4
TEXT tiplerinin bellek tablolarında saklanamayacağını unutmayın, bu nedenle bir VARCHAR yeterli olduğunda bunları kullanmak için önemli bir performans cezası vardır.
Camden

MySql utf8'in 'utf8'in karakter başına üç bayt başına karakter özelliği' , ki bu aslında utf8 değil. Gerçekte maks. utf-8 karakterindeki bayt sayısı 4'tür . Bu nedenle her zaman gerektiği için kodlamayı ayarlamak utf8mb4MySQL . utf8mb4MySql isminin geri kalanında utf8 adı verilen isimdir.
Stijn de Witt

1
@StijndeWitt, bunun için teşekkürler. UTF-8 yerine MySQL'in utf8 kodlama yöntemini kastettiğimi açıklığa kavuşturdu. Kabul edilen IANA sözleşmesi olduğu için genellikle büyük harfli varyantı "gerçek" UTF-8'i belirtmek için kullanırım.
paxdiablo

41

Kaynak

Bir varchar'ın maksimum uzunluğu MySQL'de 64KB (BLOB'ları saymaz) olan maksimum satır boyutuna tabidir:

VARCHAR (65535) Ancak, çok baytlık bir karakter kümesi kullanırsanız sınırın daha düşük olduğuna dikkat edin:

VARCHAR (21844) KARAKTER SETİ utf8


21
Lütfen CHARACTER SET utf8örneklerde kullanmayı bırakın . O olmalı CHARACTER SET utf8mb4(isterseniz tüm Unicode metin düzgün saklanmasına ... ve kim istemez ki?)
Stijn de Witt

4
İçin CHARSET=utf8mb4kullanım VARCHAR(16383).
Wil Moore III

3
Utf8mb4 kullanmak, utf8'in olmadığı bir durumda sizi dizin genişliği sınırına karşı koyacaktır. Utf8mb4'te yer alan ancak utf8'de yer almayan karakter kümelerini incelerseniz, çeşitli hiyeroglif biçimlerini ve bu tür diğer gizli karakter kümelerini dahil etmenin önemli performans cezasına (ampirik olarak belirlenir) değmeyeceğini görebilirsiniz. Stijn'in ima ettiği kadar kesilmiş ve kuru değil.
kcrossen

Birçok emoji de utf8mb4'te bulunur ve utf8'den eksiktir, böylece değerli olup olmadığının denklemini değiştirebilir.
Brian Morearty

23

MySQL belgelerinden:

MySQL 5.0.3 ve sonraki sürümlerde VARCHAR'ın etkin maksimum uzunluğu, maksimum satır boyutuna (tüm sütunlar arasında paylaşılan 65.535 bayt) ve kullanılan karakter kümesine tabidir. Örneğin, utf8 karakterleri karakter başına üç bayt gerektirebilir, bu nedenle utf8 karakter kümesini kullanan bir VARCHAR sütunu maksimum 21,844 karakter olarak bildirilebilir.

VARCHAR'ın sınırları kullanılan karakter setine göre değişir. ASCII kullanmak karakter başına 1 bayt kullanır. Yani 65.535 karakter saklayabilirsiniz. Utf8 kullanıldığında, karakter başına 3 bayt kullanılır ve bu da 21.844 karakter sınırıyla sonuçlanır. AMA kullanmanız gereken modern multibyte charset utf8mb4 kullanıyorsanız! Emojileri ve diğer özel karakterleri destekler. Karakter başına 4 bayt kullanır. Bu tablo başına karakter sayısını 16.383 ile sınırlar. INT gibi diğer alanların da bu sınırlara dahil edileceğini unutmayın.

Sonuç:

utf8 maksimum 21.844 karakter

utf8mb4 maksimum 16.383 karakterden


6

ayrıca MEDIUMBLOB / LONGBLOB veya MEDIUMTEXT / LONGTEXT kullanabilirsiniz

MySQL'deki bir BLOB tipi 65,534 bayta kadar saklayabilir, eğer bu kadar fazla veriyi depolamaya çalışırsanız MySQL verileri kısaltacaktır. MEDIUMBLOB 16.777.213 bayta kadar depolayabilir ve LONGBLOB 4.294.967.292 bayta kadar depolayabilir.


3

Mysql sürüm 5.0.3'ten önce Varchar veri türü 255 karakter depolayabilir, ancak 5.0.3'ten 65.535 karakter depolayabilir.

ANCAK 65.535 bayt maksimum satır boyutu sınırlaması vardır. Tüm sütunlar dahil, 65.535 bayttan fazla olmamalıdır.

Sizin durumunuzda, 10000'den fazla ayarlamaya çalıştığınızda 65.535'ten fazla olması ve mysql'nin hatayı vermesi mümkündür.

Daha fazla bilgi için: https://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html

örnek içeren blog: http://goo.gl/Hli6G3


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.