sql >> Databasteknik >  >> RDS >> Mysql

MySQL felaktigt strängvärde fel vid spara unicode sträng i Django

Inget av dessa svar löste problemet för mig. Grundorsaken är:

Du kan inte lagra 4-byte-tecken i MySQL med teckenuppsättningen utf-8.

MySQL har en 3 byte gräns på utf-8 tecken (ja, det är galet, bra sammanfattat av en Django-utvecklare här )

För att lösa detta behöver du:

  1. Ändra din MySQL-databas, tabell och kolumner för att använda utf8mb4 teckenuppsättning (endast tillgängligt från MySQL 5.5 och framåt)
  2. Ange teckenuppsättningen i din Django-inställningsfil enligt nedan:

settings.py

DATABASES = {
    'default': {
        'ENGINE':'django.db.backends.mysql',
        ...
        'OPTIONS': {'charset': 'utf8mb4'},
    }
}

Obs! När du återskapar din databas kan du stöta på "den angivna nyckeln var för lång ' problem.

Den mest troliga orsaken är ett CharField som har en max_längd på 255 och något slags index på sig (t.ex. unikt). Eftersom utf8mb4 använder 33 % mer utrymme än utf-8 måste du göra dessa fält 33 % mindre.

I det här fallet ändrar du max_length från 255 till 191.

Alternativt kan du redigera din MySQL-konfiguration för att ta bort denna begränsning men inte utan något django-hackeri

UPPDATERING: Jag stötte precis på det här problemet igen och slutade med att bytte till PostgreSQL eftersom jag inte kunde minska min VARCHAR till 191 tecken.



  1. pyodbc - mycket långsam bulkinserthastighet

  2. SQL Server Transaktionslogg — Del 2

  3. Anslut till en heroku-databas med pgadmin

  4. I Oracle, är det möjligt att INFOGA eller UPPDATERA en post genom en vy?