sql >> Database >  >> RDS >> Mysql

MySQL onjuiste tekenreekswaardefout bij het opslaan van unicode-tekenreeks in Django

Geen van deze antwoorden loste het probleem voor mij op. De hoofdoorzaak is:

U kunt geen 4-byte-tekens in MySQL opslaan met de utf-8-tekenset.

MySQL heeft een 3-byte limiet voor utf-8 tekens (ja, het is gek, mooi samengevat door een Django-ontwikkelaar hier )

Om dit op te lossen moet je:

  1. Wijzig uw MySQL-database, tabel en kolommen om de utf8mb4-tekenset (alleen beschikbaar vanaf MySQL 5.5)
  2. Specificeer de tekenset in uw Django-instellingenbestand zoals hieronder:

settings.py

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

Opmerking:wanneer u uw database opnieuw aanmaakt, kunt u de 'Opgegeven sleutel was te lang tegenkomen ' kwestie.

De meest waarschijnlijke oorzaak is een CharField die een max_length van 255 heeft en een soort index erop (bijvoorbeeld uniek). Omdat utf8mb4 33% meer ruimte gebruikt dan utf-8, moet u deze velden 33% kleiner maken.

Verander in dit geval de max_length van 255 in 191.

U kunt ook uw MySQL-configuratie bewerken om deze beperking te verwijderen maar niet zonder wat django-hackery

UPDATE: Ik kwam dit probleem net weer tegen en eindigde overschakelen naar PostgreSQL omdat ik mijn VARCHAR . niet kon verminderen tot 191 tekens.



  1. De beste manier om het aantal resultaten te krijgen voordat LIMIT werd toegepast

  2. Hoe een enkele SQL Server-verbindingsinstantie open te houden voor meerdere aanvragen in C#?

  3. Hoe de SQL SUM-functie te gebruiken

  4. SQLite-datum en tijd