2015-04-15 40 views
0

當db使用latin1編碼時,我不知道如何連接到mysql db。 我嘗試並按照文檔,我正在使用mysqlclient==1.3.5這裏是我的數據庫連接設置。如何在Django中設置character_set_results latin1 mysql?

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'test_api', 
     'USER': 'admin', 
     'PASSWORD': '123456', 
     'HOST': '192.168.59.103', 
     'PORT': '3306', 
     'OPTIONS': { 
      'charset': 'latin1', 'use_unicode': False 

     }, 
    } 
} 

37 Phẩm Bá»「 tát hạnh 
Am mây ngủ 
An cứ kiết hạ 
An lạc từ tâm 
An lạc từng bước chân 
Ãnh Sáng Từ Bi 

但它沒有成功,所以接下來我嘗試使用pymysql在下面編寫一個簡單的腳本,它工作正常。

# -*- coding: utf-8 -*- 
import pymysql 
connection = pymysql.connect(host='192.168.59.103', port=3306, user='admin', passwd='123456', db='test_api', use_unicode=False) 

customers = connection.cursor(pymysql.cursors.DictCursor) 
customers.execute('SET character_set_results=\'latin1\'') 
customers.execute('SELECT * FROM bz_media_album ORDER BY name_vn') 
for customer in customers: 
    print customer['name_vn'] 

37 Phẩm Bồ tát hạnh 
Am mây ngủ 
An cứ kiết hạ 
An lạc từ tâm 
An lạc từng bước chân 
Ánh Sáng Từ Bi 

我也覺得https://stackoverflow.com/a/25685134/523075 但不知道如何實現它。

因爲我所有的表使用latin1的,我的問題是如何character_set_results Django的遊標,因爲我使用Django和tastypie開發移動API。我也有模型和資源。

回答

1

第一行應該是Phẩm Bồ tát hạnh?如果是這樣,可能這是發生了什麼事:

  • 您已在客戶端
  • 您執行SET NAMES latin1 UTF8編碼的字節(或在Python/Django的等效)
  • 在表中的列被宣佈CHARACTER SET latin1

一切都需要ut8。但要修復數據,你需要的2-step ALTER,從而有效地說道做

  • ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
  • ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;

,其中長度足夠大,其他的「...」有其他任何(NOT NULL等)已經在列上。

建議您測試此外部製作。

編輯

您在數據庫中的垃圾。任何試圖快速修復表格的嘗試都可能導致更糟糕的混亂。

可能使輸出的 「看」 的權利:

CONVERT(BINARY(column_name) USING utf8) 
+0

但我不希望在當前的分貝觸摸,因爲它有很多使用該數據庫已經服務。 – giaosudau

1

我使用下面的信號解決了類似的問題:

# apps.my_app.signals.py 
from django.db.backends.signals import connection_created 
from django.dispatch import receiver 


@receiver(connection_created) 
def set_character_set_results(*args, connection, **kwargs): 
    with connection.cursor() as cursor: 
     cursor.execute('SET CHARACTER_SET_RESULTS = \'latin1\'') 

這則需要連接最多in the usual way

這應該與MySQL 4.1或更高版本的工作。

我們的用例,從其中我們也不想改變的編碼,因爲它是被讀取和遺留系統寫入到一個MySQL數據庫讀取。我們也有另一個(Postgres的)數據庫,因此實際的代碼更像是:

from django.db.backends.signals import connection_created 
from django.dispatch import receiver 


@receiver(connection_created) 
def set_character_set_results(*args, connection, **kwargs): 
    if connection.alias == 'legacy': 
     with connection.cursor() as cursor: 
      cursor.execute('SET CHARACTER_SET_RESULTS = \'latin1\'') 
+0

請注意,'MySQLdb.python'模塊有一個['set_character_set'方法](https://github.com/farcepest/MySQLdb1/blob/d34fac681487541e4be07e6978e0db233faf8252/MySQLdb/connections.py#L301),這可能會解決問題除了正確讀取一些非ASCII字符之外。 – Jonathan