2011-05-18 7 views
18

Estoy teniendo el utf-8 vs. problemas de cadena de bytes mencionados aquí: Django headache with simple non-ascii string¿Cómo se cambia el tipo de clasificación para una columna MySQL?

No me importa la coincidencia de mayúsculas y minúsculas en las columnas de MySQL, siempre quiero que se devuelvan cadenas UTF-8 porque me resulta imposible tratar cadenas de bytes devueltas para columnas de caracteres para texto no ascii

¿Cómo cambio mi tipo de intercalación MySQL para que las cadenas UTF-8 siempre se devuelvan a través de Django?

+0

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

+1

Encuentro las intercalaciones insensibles a mayúsculas y minúsculas; Espero * que mis coincidencias de cadena sean sensibles a mayúsculas y minúsculas a menos que explícitamente les pida que no sean ... De todos modos, todas las interpolaciones UTF8 tienen variaciones sensibles a mayúsculas y minúsculas, por lo que aún puede conservar el comportamiento que prefiera. –

Respuesta

24

Necesita ser consciente de los ajustes/intercalación de juegos de caracteres en los niveles de base de datos/tabla/columna. La configuración de nivel de columna tiene prioridad sobre las demás. Debido a esto, incluyo comandos que puede usar para realizar estos cambios en cada nivel de la base de datos.


Inspeccione su configuración actual (base de datos):

SHOW CREATE DATABASE db_name;

Inspeccione su configuración actual (tabla):

SHOW TABLE STATUS WHERE name='tbl_name'

Inspeccione su configuración actual (columnas):

SHOW FULL COLUMNS FROM tbl_name;


Cambiar el/la colación de juego de caracteres (base de datos):

ALTER DATABASE db_name DEFAULT CHARACTER SET utf8;

Cambiar el juego de caracteres/colación (tabla):

ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8;

Cambio el juego de caracteres/colación (columnas):

ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;

+0

Comment @ user1450663: Tal como se establece oficialmente [aquí] (https://docs.djangoproject.com/en/dev/ref/databases/#collation-settings), Django no admite ninguna forma de manipulación de intercalación a través de ORM. – Damon

+1

¿Cuál es la diferencia entre las opciones de tabla y columnas? Parece que ambos cambian la intercalación para la tabla completa – sunprophit

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

Aunque es útil, esto solo cambia el valor predeterminado para las tablas nuevas, no altera la intercalación de las existentes (que es lo que necesita el OP). –

3

Tenga en cuenta que si realmente se quería cambiar la intercalación de una sola columna (no se me ocurre por qué es posible, pero quién sabe), entonces esta es la sintaxis para alterar una columna TEXT llama en DESCRIPTION la tabla ITEMS a UTF-8, binario, no nulo:

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

no es un caso sensible UTF-8 cotejo per se, pero el cotejo utf8_bin funciona para la mayoría de los casos.

3

En Django debe escribir su propia migración:

./manage.py makemigrations --empty app_name 

Y llenar la migración vacío con estos comandos SQL como esto:

# -*- 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

Esto fue útil junto con el siguiente SQL en la publicación de David G. –

+0

Cuando retrocede a alguna migración, le da '... no es reversible'. ¿Cómo uso 'reverse_code = migrations.RunPython.noop' ​​con la operación' RunSQL'? – Hussain

+0

@Hussain puede usar 'reverse_sql' como segundo parámetro en' RunSQL'. Elsewere puede pasar 'RunSQL.noop' ​​como' sql' o 'reverse_sql' param. [documentación] (https://docs.djangoproject.com/en/1.10/ref/migration-operations/#runsql) –

Cuestiones relacionadas