Tôi đang sử dụng Python 2.7 và MySQLdb 1.2.3. Tôi đã thử tất cả mọi thứ tôi tìm thấy trên stackoverflow và các diễn đàn khác để xử lý các lỗi mã hóa kịch bản của tôi là ném. Kịch bản lệnh của tôi đọc dữ liệu từ tất cả các bảng trong MySQL DB nguồn, viết chúng trong một đối tượng python StringIO.StringIO
và sau đó tải dữ liệu đó từ đối tượng StringIO
tới cơ sở dữ liệu Postgres (có định dạng mã hóa UTF-8). Các thuộc tính - Định nghĩa cơ sở dữ liệu trong pgadmin) bằng lệnh copy_from của thư viện psycopg2.UnicodeEncodeError: codec 'ascii' không thể mã hóa ký tự u ' u2019' ở vị trí 47: thứ tự không nằm trong phạm vi (128)
Tôi phát hiện ra rằng cơ sở dữ liệu MySQL nguồn của tôi có một số bảng trong mã hóa latin1_swedish_ci trong khi các mã khác trong định dạng mã hóa utf_8 (Tìm thấy từ TABLE_COLLATION trong information_schema.tables).
Tôi đã viết tất cả mã này trên đầu tập lệnh Python của mình dựa trên nghiên cứu của tôi trên internet.
db_conn = MySQLdb.connect(host=host,user=user,passwd=passwd,db=db, charset="utf8", init_command='SET NAMES UTF8' ,use_unicode=True)
db_conn.set_character_set('utf8')
db_conn_cursor = db_conn.cursor()
db_conn_cursor.execute('SET NAMES utf8;')
db_conn_cursor.execute('SET CHARACTER SET utf8;')
db_conn_cursor.execute('SET character_set_connection=utf8;')
tôi vẫn nhận được UnicodeEncodeError
dưới đây với dòng này: cell = str(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "") #Remove unwanted characters from column value
,
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 47: ordinal not in range(128)
tôi đã viết các dòng mã sau đây để làm sạch các tế bào trong mỗi bảng của cơ sở dữ liệu nguồn MySQL khi văn bản cho đối tượng StringIO.
cell = str(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "") #Remove unwanted characters from column value
Xin vui lòng trợ giúp.
Vì vậy, ô là giá trị cột cho một hàng trong một bảng (từ nguồn MySQL DB nơi tôi đã thực thi UTF-8 đọc theo mọi cách như bạn có thể thấy ở trên). ô có thể giữ bất kỳ thứ gì từ 1, 50, 100, "Robert", "Đây là câu" v.v. – user3422637
thử 'in repr (ô)' sẽ hữu ích hơn (đặc biệt là khi nó bị treo) –
Tôi vừa thử trước và sau khi str() xảy ra. Tôi có một cái gì đó như thế này: Đối với hai sự xuất hiện của ô Trước str(): 2L Sau str(): '2' Trước str(): u'Jog ' Sau str():' Jog ' Chương trình không sụp đổ cho các giá trị này của ô btw. Tôi không thể viết ở đây các văn bản trong tế bào nhưng tôi có thể cho bạn biết đó là một câu dài và có một dấu nháy đơn trong nó '' ' – user3422637