2011-05-18 3 views
18

Je vais avoir le Vs utf-8. problèmes de chaîne d'octets mentionnés ici: Django headache with simple non-ascii stringComment changer le type de collation pour une colonne MySQL?

Je ne se soucient pas respecter la casse sensible dans les colonnes MySQL, je viens toujours veux des chaînes de caractères UTF-8 sont revenus parce que je trouve qu'il est impossible de traiter avec des chaînes d'octets retournées pour les colonnes de caractères pour texte non-ascii. Comment changer mon type de classement MySQL afin que les chaînes UTF-8 soient toujours renvoyées via Django?

+0

http://dev.mysql.com/doc/refman /5.0/en/charset-column.html –

+1

Je trouve la collation insensible à la casse bizarre; J'attends * que mes chaînes soient sensibles à la casse sauf si je leur demande explicitement de ne pas l'être ... Quoi qu'il en soit, tous les classements UTF8 ont des variations sensibles à la casse et à la casse, donc vous pouvez toujours garder le comportement que vous préférez. –

Répondre

24

Vous devez connaître les paramètres de jeu de caractères/de classement au niveau de la base de données/table/colonne. Les paramètres au niveau des colonnes ont la priorité sur les autres. Pour cette raison, j'inclus les commandes que vous pouvez utiliser pour effectuer ces changements à chaque niveau de la base de données.


Vérifiez votre configuration actuelle (base de données):

SHOW CREATE DATABASE db_name;

Vérifiez votre configuration actuelle (tableau):

SHOW TABLE STATUS WHERE name='tbl_name'

Vérifiez votre configuration actuelle (colonnes):

SHOW FULL COLUMNS FROM tbl_name;


Modifier le jeu de caractères/collation (base de données):

ALTER DATABASE db_name DEFAULT CHARACTER SET utf8;

Modifier le character-set/collation (tableau):

ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8;

changement le jeu de caractères/collation (colonnes):

ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;

+0

Comment @ user1450663: Comme indiqué officiellement [ici] (https://docs.djangoproject.com/fr/dev/ref/databases/#collation-settings), Django ne prend en charge aucun moyen de manipulation de classement via ORM. – Damon

+1

Quelle est la différence entre les options de table et de colonne? Il semble que les deux changent de collation pour la table entière – sunprophit

3
ALTER DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci 
+2

Bien qu'utile, cela ne change que la valeur par défaut pour les nouvelles tables, il ne modifie pas le classement pour les tables existantes (ce qui est nécessaire à l'OP). –

3

Notez que si vous voulais vraiment changer le classement pour une seule colonne (je ne peux pas penser pourquoi vous pourriez, mais qui sait) alors c'est la syntaxe pour modifier une colonne TEXT appelé DESCRIPTION en la table ITEMS en UTF-8, binaire, non nul:

ALTER TABLE ITEMS CHANGE DESCRIPTION DESCRIPTION TEXT CHARACTER SET utf8 
    COLLATE utf8_bin NOT NULL; 

Il n'y a pas sensible à la casse UTF-8 collation en soi mais fonctionne le classement utf8_bin pour la plupart des cas.

3

En django vous devez écrire votre propre migration:

./manage.py makemigrations --empty app_name 

et remplir la migration vide avec ces commandes SQL comme ceci:

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 

from django.db import models, migrations 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('app', '0008_prev_migration'), 
    ] 

    operations = [ 
     migrations.RunSQL('ALTER DATABASE db_name DEFAULT CHARACTER SET utf8;'), 
     migrations.RunSQL('ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8;'), 
     migrations.RunSQL('ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;'), 
    ] 
+0

Cela a été utile en conjonction avec le SQL ci-dessous dans la publication de David G. –

+0

Lorsque vous annulez une migration, elle donne '... n'est pas réversible'. Comment utiliser l'opération 'reverse_code = migrations.RunPython.noop' ​​avec' RunSQL'? – Hussain

+0

@Hussain vous pouvez utiliser 'reverse_sql' comme second paramètre dans' RunSQL'. Elsewere peut passer 'RunSQL.noop' ​​comme paramètre' sql' ou 'reverse_sql'. [documentation] (https://docs.djangoproject.com/fr/1.10/ref/migration-operations/#runsql) –

Questions connexes