sql >> Database >  >> Database Tools >> phpMyAdmin

Wat gebeurt er met bestaande gegevens als ik de sortering van een kolom in MySQL wijzig?

Het artikel http://mysqldump.azundris.com/archives/60 -Handling-character-sets.html bespreekt dit uitgebreid en laat ook zien wat er gaat gebeuren.

Houd er rekening mee dat je een KARAKTERSET (eigenlijk een codering) door elkaar haalt met een VERZAMELING.

Een tekenset definieert de fysieke representatie van een string in bytes op schijf. Je kunt dit zichtbaar maken met de HEX() functie, bijvoorbeeld SELECT HEX(str) FROM t WHERE id = 1 om te zien hoe MySQL de bytes van uw string opslaat. Wat MySQL u levert, kan verschillen, afhankelijk van de tekenset van uw verbinding, gedefinieerd met SET NAMES .... .

Een sortering is een sorteervolgorde. Het is afhankelijk van de tekenset. Uw gegevens kunnen bijvoorbeeld in de latin1-tekenset staan, maar ze kunnen zijn gerangschikt volgens een van de twee Duitse sorteervolgorden latin1_german1_ci of latin1_german2_ci. Afhankelijk van uw keuze, zullen umlauts zoals ö ofwel sorteren als oe of als o.

Wanneer u een tekenset wijzigt, moeten de gegevens in uw tabel worden herschreven. MySQL leest alle gegevens en alle indexen in de tabel, maakt een verborgen kopie van de tabel die tijdelijk schijfruimte in beslag neemt, verplaatst vervolgens de oude tabel naar een verborgen locatie, verplaatst de verborgen tabel op zijn plaats en laat de oude gegevens vallen, waardoor schijfruimte op. Voor enige tijd daartussen heb je twee keer zoveel opslagruimte nodig.

Wanneer u een sortering wijzigt, verandert de sorteervolgorde van de gegevens, maar niet de gegevens zelf. Als de kolom die u wijzigt geen deel uitmaakt van een index, hoeft u niets anders te doen dan het frm-bestand te herschrijven, en voldoende recente versies van MySQL zouden niet meer moeten doen.

Wanneer u een sortering wijzigt van een kolom die deel uitmaakt van een index, moet de index worden herschreven, aangezien een index een gesorteerd fragment van een tabel is. Dit activeert opnieuw de ALTER TABLE tabelkopieerlogica zoals hierboven beschreven.

MySQL probeert gegevens te bewaren door dit te doen:Zolang de gegevens die je hebt kunnen worden weergegeven in de doeltekenset, zal de conversie niet verliesgevend zijn. Waarschuwingen worden afgedrukt als er gegevens worden afgekapt en gegevens die niet kunnen worden weergegeven in de doeltekenset worden vervangen door ?



  1. Hoe kan ik alle db-triggers in MySQL vinden?

  2. SQL-opdracht Databasediagrammen toevoegen

  3. SQL-bladwijzers sorteren

  4. hoe maak je een citaat van de dag met behulp van php en mysql in volgorde van id