[MySQL] VARCHAR or TEXT bij grote tekst en gebruik van UTF8?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Barleone
  • Registratie: Maart 2009
  • Laatst online: 12:48
offtopic:
O-) Om te beginnen: deze vraag is al miljoen keer gesteld op internet, maar ik begrijp het technisch Engels niet zo goed, en kom ook steeds tegenstrijdige 'feiten' (lees: meningen) tegen waar ik niets mee kan.

TODO: Ik moet een database veld maken in MySQL dat teksten moet kunnen opslaan die groter kunnen zijn dan 255 karakters. De teksten worden (als het goed is) in UTF-8 opgeslagen.

Q: Nu zoek ik dus het correcte veldtype om die teksten in op te kunnen slaan. Op internet kom ik regelmatig tegen dat een VARCHAR veel meer dan 255 karakters kan opslaan.
(Zoals de topictitel suggereert wil ik een keus maken tussen VARCHAR en TEXT.)

http://dev.mysql.com/doc/...tring-type-overview.html:
VARCHAR: The effective maximum length of a VARCHAR is subject to the maximum row size (65,535 bytes, which is shared among all columns) and the character set used. For example, utf8 characters can require up to three bytes per character, so a VARCHAR column that uses the utf8 character set can be declared to be a maximum of 21,844 characters.

TEXT: A TEXT column with a maximum length of 65,535 (216 – 1) characters. The effective maximum length is less if the value contains multi-byte characters. Each TEXT value is stored using a two-byte length prefix that indicates the number of bytes in the value.
Ik kan alleen geen keuze maken tussen deze twee. Qua performance liggen ze niet ver uit elkaar heb ik een keer of 5 gelezen op internet.
Dus welke plussen en minnen zijn er dan te bedenken?
  • doorzoekbaarheid (graag case insensitive)
  • whitespace geintjes (aka spaties die worden toegevoegd of newlines die kapotgaan na het opslaan ofzo?)
  • Overige? Geef aub je reactie in dit topic.
offtopic:
Ik weet het ook allemaal niet, maar hier komt vast wel eens iemand met bruikbare ervaringen.
disclaimer: Sorry dat dit nogal dom overkomt met miljoenen Google-hits op dit onderwerp, maar ik zie van de bomen het bos niet meer. Ik heb echt een uur gezocht met allerlei searchfrases. Ook op GoT!

Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
The effective maximum length of a VARCHAR is subject to the maximum row size (65,535 bytes, which is shared among all columns) and the character set used.
Een record mag max. 64K groot zijn. 1 Varchar van die grootte (of 2 van 32K) en je kunt niets anders meer kwijt in je record ;)
TEXT heeft daar (althans, AFAIK) geen last van. Die slaat (feitelijk) gewoon een pointer op naar een plek waar de daadwerkelijke inhoud staat. Dat is ook meteen 1 van de diepere onderliggende gedachtes waarom je bijv. wel een group-by op een VARCHAR kunt doen en niet op een TEXT of waarom bepaalde andere functies niet met TEXT overweg kunnen. Of dat bij MySQL zo is weet ik eigenlijk niet maar andere RDBMS'en hebben daar bij mijn weten wel 'last' van.

Er is overigens ook nog een LongText (daar heb ik mee eens op verkeken toen ik een MSSQL project naar MySQL wou omzetten en een TEXT groter dan 64K niet bleek te passen in MySQL). Leve eenheid :X

[ Voor 21% gewijzigd door RobIII op 03-09-2010 00:49 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Barleone
  • Registratie: Maart 2009
  • Laatst online: 12:48
RobIII schreef op vrijdag 03 september 2010 @ 00:43:
[...]
Een record mag max. 64K groot zijn. 1 Varchar van die grootte en je kunt niets anders meer kwijt in je record ;)
Text heeft daar (althans, AFAIK) geen last van. Die slaat (feitelijk) gewoon een pointer op naar een plek waar de daadwerkelijke inhoud staat.
Ah, dat bedoel ik dus met mijn beperkte Engels. Totaal overheen gelezen.
Dus als je een id + titeltje + tekst wilt opslaan en je tekst is met een varchar 64k dan hebben je id en titeltje pech. Begrijp ik het zo goed?

Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Barleone schreef op vrijdag 03 september 2010 @ 00:48:
Dus als je een id + titeltje + tekst wilt opslaan en je tekst is met een varchar 64k dan hebben je id en titeltje pech.
Nou, je kunt (als het goed is althans) niet eens een tabel definiëren op die manier. MySQL kan namelijk op voorhand al aangeven dat 't niet gaat passen. En mocht je het wel kunnen definiëren dan zal de insert waarschijnlijk falen (want >64k). Enige manier waarop MySQL dit alsnog zou vreten (en het zou me niets verbazen...) is als bij een insert de grootte van id + titel + tekst <= 64k. Dus als je de tekst niet volledig zou vullen. Hoe dan ook; dit is niet iets waar je aan wil beginnen.

Edit: Zojuist even geprobeerd:
Afbeeldingslocatie: http://tweakers.net/ext/f/SJGu6YBq7oFxtgdBaN21yC3l/thumb.png
Mijn assumptie was dus correct (op 't eerste gezicht) :)

[ Voor 15% gewijzigd door RobIII op 03-09-2010 18:20 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Barleone
  • Registratie: Maart 2009
  • Laatst online: 12:48
Thanks mate, en dat om 00:55 _/-\o_

Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?