MySQL'de varchar (max) eşdeğeri?


Yanıtlar:


195

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) CHARACTER SET utf8

İşte bazı örnekler:

Maksimum satır boyutu 65535'tir, ancak bir varchar ayrıca belirli bir dizenin uzunluğunu kodlamak için bir veya iki bayt içerir. Böylece, tablodaki tek sütun olsa bile, maksimum satır boyutunun bir varcharını beyan edemezsiniz.

mysql> CREATE TABLE foo ( v VARCHAR(65534) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

Ancak uzunlukları azaltmaya çalışırsak, işe yarayan en büyük uzunluğu buluruz:

mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)

Şimdi tablo düzeyinde çok baytlı bir karakter seti kullanmaya çalışırsak, her karakteri birden çok bayt olarak sayarız. UTF8 dizeleri yok ille dize başına birden fazla bayt kullandığını ancak MySQL sen tek bayt karakter Gelecekte bütün ekler kısıtlarsınız kabul edemeyiz.

mysql> CREATE TABLE foo ( v VARCHAR(65532) ) CHARSET=utf8;
ERROR 1074 (42000): Column length too big for column 'v' (max = 21845); use BLOB or TEXT instead

Son hatanın bize söylediklerine rağmen, InnoDB hala 21845 uzunluğunu sevmiyor.

mysql> CREATE TABLE foo ( v VARCHAR(21845) ) CHARSET=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

Yine de işe yaramayacak olan 21845 * 3 = 65535'i hesaplarsanız, bu çok mantıklıdır. Halbuki 21844 * 3 = 65532, ki bu işe yarıyor.

mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)

20
Ayrıca TEXT
Adi

2
@AdnanShammout: Tabii, DEFAULTsütun için bir değer bildirmek istemiyorsanız . METİN veya BLOB türleri ile bunu yapamazsınız.
Bill Karwin

5
@DanW, TEXTuzunluk sınırı 64K'dır . MEDIUMTEXTuzunluk sınırı 16M'dir. LONGTEXTuzunluk sınırı 4G'dir.
Bill Karwin

4
Bununla ilgili en büyük sorun, o boyutta bir sütun oluşturursanız , tablonuzda yalnızca bir sütun bulunabilmesidir. MAX MySql satır boyutu sizin olsun hepsi bu, bir 64k sütun var eğer öyleyse, 64k olduğunu. Aynı kısıtlama, Sql Server'ın varchar(max)sütun türü için geçerli değildir .
joshperry

1
@joshperry, evet, ancak TEXT / BLOB sütunları bu 64KB satır boyutu sınırına sadece küçük bir miktar (9-12 bayt) sayar, bu nedenle büyük bir VARCHAR'ın yanı sıra başka sütunlara da ihtiyacınız varsa TEXT kullanmak daha iyidir.
Bill Karwin

74

TLDR; MySql eşdeğer bir kavram yok varchar(max), bu bir MS SQL Server özelliğidir.

VARCHAR (maks.) Nedir?

varchar(max) Microsoft SQL Server'ın bir özelliğidir.

Bir sütunun, 2005 sürümünden önceki Microsoft SQL Server sürümlerinde depolayabileceği veri miktarı 8 KB ile sınırlıdır. Daha 8KB daha depolamak için kullanmak zorunda kalacak TEXT, NTEXTya BLOB, 8K sayfalık bir koleksiyon olarak verilerini saklı bu sütun türleri tablo veri sayfalarından ayrı sütunlar türlerini; satır başına 2 GB'a kadar depolamayı desteklediler.

Bu sütun türlerine yönelik büyük uyarı, verilere erişmek ve bunları değiştirmek için genellikle özel işlevlere ve ifadelere ihtiyaç duymalarıydı (örn READTEXT. WRITETEXT, Ve UPDATETEXT)

SQL Server 2005'te, varchar(max)büyük sütunlardaki verileri almak ve değiştirmek için kullanılan verileri ve sorguları birleştirmek için tanıtıldı. varchar(max)Sütunlara ait veriler , tablo veri sayfaları ile birlikte depolanır.

MAX sütunundaki veriler 8KB veri sayfasını doldurdukça bir taşma sayfası ayrılır ve önceki sayfa bağlantılı bir liste oluşturarak bunu gösterir. Aksine TEXT, NTEXTve sütun türü diğer sütun türleri aynı sorgu semantik tüm destekler.BLOBvarchar(max)

Yani varchar(MAX)gerçekten demek varchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)ve değil varchar(MAX_SIZE_OF_A_COLUMN).

MySql eşdeğer bir deyime sahip değildir.

varchar(max)MySql ile aynı miktarda depolama alanı elde etmek için yine de bir BLOBsütun türüne başvurmanız gerekir . Bu makalede , büyük miktarda veriyi MySql'de verimli bir şekilde depolamak için çok etkili bir yöntem anlatılmaktadır.


1
Bunun SQL Server ile MySQL'den daha fazla ilgisi var.
Kermit

14
Evet @njk ama MySql "eşdeğer" (veya bu durumda eşdeğeri eksikliği) tam olarak ne açıklayan gerektirdiği ne anlatmak amacıyla varchar(max) gerçekten aracı.
joshperry

29

Bir varchar'ın maksimum uzunluğu

65535

karakter kümesindeki bir karakterin maksimum bayt uzunluğuna bölünmesiyle sütun ayarlanır (örn. utf8 = 3 bayt, ucs2 = 2, latin1 = 1).

uzunluğu saklamak için eksi 2 bayt

eksi diğer tüm sütunların uzunluğu

boş olan her 8 sütun için eksi 1 bayt. Sütun null / null değilse, null mask adı verilen bir bayt / baytta bir bit olarak, null olabilecek sütun başına 1 bit olarak depolanır.


Cevabınızın biçimini beğendim, ancak üst cevabın karakter setleri ve şeyler hakkında sağladığı bazı yararlı bilgileri eksik gibi görünüyor
Joe Phillips

3

Sql Server için

değiştirme tablosu prg_ar_report_colors add Text_Color_Code VARCHAR (maks.);

MySql için

değiştirme tablosu prg_ar_report_colors add Text_Color_Code longtext;

Oracle için

değiştirme tablosu prg_ar_report_colors add Text_Color_Code CLOB;


1
uzun metin, metin ve blobun varchar'dan farklı saklandığını unutmayın. varchar diğer alanlarla, metin ise sunucudaki ayrı bir dosyada saklanır. artılarını ve eksilerini seçmek için hangisini çok dikkatli
santiago arizti

0

Mysql Sınır boyutu altında VARCHAR'dan METİN'e sütun dönüştürme !!!

mysql> CREATE TABLE varchars1(ch3 varchar(6),ch1 varchar(3),ch varchar(4000000))
;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+-------+------+---------------------------------------------+
| Level | Code | Message                                     |
+-------+------+---------------------------------------------+
| Note  | 1246 | Converting column 'ch' from VARCHAR to TEXT |
+-------+------+---------------------------------------------+
1 row in set (0.00 sec)

mysql>

-11

MySQL 5.6.12'deki bir varchar'ın maksimum uzunluğu 4294967295'tir.

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.