2011-05-18 4 views
18

मेरे पास utf-8 बनाम है। बाइट स्ट्रिंग समस्याएं यहां उल्लिखित हैं: Django headache with simple non-ascii stringआप एक MySQL कॉलम के लिए संयोजन प्रकार कैसे बदलते हैं?

मुझे माईएसक्यूएल कॉलम में केस संवेदनशील मिलान के बारे में परवाह नहीं है, मैं हमेशा यूटीएफ -8 स्ट्रिंग लौटाता हूं क्योंकि मुझे लगता है कि चरित्र कॉलम के लिए बाइट स्ट्रिंग से निपटना असंभव है गैर-असीसी पाठ।

मैं अपना MySQL संयोजन प्रकार कैसे बदलूं ताकि यूटीएफ -8 तार हमेशा Django के माध्यम से वापस आ जाए?

+0

http://dev.mysql.com/doc/refman /5.0/en/charset-column।एचटीएमएल –

+1

मुझे मामला असंवेदनशील collations अजीब लगता है; मैं * उम्मीद करता हूं * मेरे स्ट्रिंग मैसेज केस संवेदनशील होने तक मेल नहीं करते हैं जब तक कि मैं स्पष्ट रूप से उनसे नहीं पूछता ... किसी भी तरह, सभी यूटीएफ 8 कॉलेशन में केस संवेदनशील और केस असंवेदनशील भिन्नताएं होती हैं, ताकि आप जो भी व्यवहार पसंद करते हैं, तब भी आप रख सकें। –

उत्तर

24

आपको डेटाबेस/तालिका/कॉलम स्तर पर चरित्र-सेट/संयोजन सेटिंग्स से अवगत होना चाहिए। कॉलम-स्तरीय सेटिंग्स दूसरों पर प्राथमिकता लेती हैं। इस वजह से, मैं उन आदेशों को शामिल कर रहा हूं जिनका उपयोग आप इन परिवर्तनों को डीबी के प्रत्येक स्तर पर करने के लिए कर सकते हैं।


अपने वर्तमान विन्यास (डेटाबेस) का निरीक्षण करें:

SHOW CREATE DATABASE db_name;

अपने वर्तमान विन्यास (टेबल) का निरीक्षण करें:

SHOW TABLE STATUS WHERE name='tbl_name'

अपने वर्तमान विन्यास (कॉलम) का निरीक्षण करें:

SHOW FULL COLUMNS FROM tbl_name;


बदलें चरित्र सेट/मिलान (डेटाबेस):

ALTER DATABASE db_name DEFAULT CHARACTER SET utf8;

बदलें चरित्र सेट/मिलान (टेबल):

ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8;

बदलें चरित्र-सेट/संयोजन (कॉलम):

ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;

+0

टिप्पणी @ user1450663: आधिकारिक तौर पर [यहां] (https://docs.djangoproject.com/en/dev/ref/databases/#collation-settings) के रूप में, Django ओआरएम के माध्यम से collation manipulation के लिए किसी भी तरह का समर्थन नहीं करता है। – Damon

+1

तालिका और कॉलम विकल्पों के बीच क्या अंतर है? लगता है कि उनमें से दोनों पूरे टेबल – sunprophit

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

उपयोगी होने पर, यह केवल नई तालिकाओं के लिए डिफ़ॉल्ट बदलता है, यह मौजूदा लोगों के लिए संयोजन को परिवर्तित नहीं करता है (जो ओपी की आवश्यकता है)। –

3

ध्यान दें कि यदि आप वास्तव में केवल एक कॉलम के लिए मिलान बदलने के लिए करना चाहता था (मुझे नहीं लगता कि कर सकते हैं तुम क्यों हो सकता है, लेकिन कौन जानता है) तो इस वाक्य रचना एक TEXT कॉलम में DESCRIPTION कहा जाता है को बदलने के लिए है UTF-8, द्विआधारी गैर-शून्य करने के लिए ITEMS तालिका:

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

वहाँ एक केस-संवेदी UTF-8 मिलान से प्रति नहीं है, लेकिन utf8_bin मिलान ज्यादातर मामलों के लिए काम करता है।

3

में django आप अपने स्वयं के माइग्रेशन लिखना चाहिए:

./manage.py makemigrations --empty app_name 

और इस तरह इन एसक्यूएल कमांड के साथ खाली प्रवास को भरने:

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

के लिए संयोजन बदल रहे हैं यह डेविड जी के पोस्ट में नीचे दिए गए एसक्यूएल के साथ मिलकर सहायक था। –

+0

जब आप कुछ माइग्रेशन में रोलबैक करते हैं, तो यह '... उलटा नहीं है'। मैं 'runSQL' ऑपरेशन के साथ' reverse_code = migrations.RunPython.noop' ​​का उपयोग कैसे करूं? – Hussain

+0

@ हुसैन आप 'runSQL' में दूसरे param के रूप में' reverse_sql' का उपयोग कर सकते हैं। Elsewere 'RunSQL.noop' ​​को' sql' या 'reverse_sql' param के रूप में पास कर सकता है। [प्रलेखन] (https://docs.djangoproject.com/en/1.10/ref/migration-operations/#runsql) –

संबंधित मुद्दे