SORU
21 Ocak 2010, PERŞEMBE


MySQL "hatalı dize değeri" unicode dize kaydetme sırasında hata Django

Garip bir hata iletisi auth_user. Django için Adı, Soyadı model kurtarmaya çalıştı.

Başarısız örnekler

user = User.object.create_user(username, email, password)
user.first_name = u'Rytis'
user.last_name = u'Slatkevičius'
user.save()
>>> Incorrect string value: '\xC4\x8Dius' for column 'last_name' at row 104

user.first_name = u'Валерий'
user.last_name = u'Богданов'
user.save()
>>> Incorrect string value: '\xD0\x92\xD0\xB0\xD0\xBB...' for column 'first_name' at row 104

user.first_name = u'Krzysztof'
user.last_name = u'Szukiełojć'
user.save()
>>> Incorrect string value: '\xC5\x82oj\xC4\x87' for column 'last_name' at row 104

Örnekler başarılı

user.first_name = u'Marcin'
user.last_name = u'Król'
user.save()
>>> SUCCEED

MySQL ayarları

mysql> show variables like 'char%';
 -------------------------- ---------------------------- 
| Variable_name            | Value                      |
 -------------------------- ---------------------------- 
| character_set_client     | utf8                       | 
| character_set_connection | utf8                       | 
| character_set_database   | utf8                       | 
| character_set_filesystem | binary                     | 
| character_set_results    | utf8                       | 
| character_set_server     | utf8                       | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
 -------------------------- ---------------------------- 
8 rows in set (0.00 sec)

Tablo karakter seti ve harmanlama

Tablo auth_user utf-8 harmanlama utf8_general_ci olan karakter vardır.

UPDATE komutu sağlar

UPDATE komutunu kullanarak tablo auth_user için yukarıdaki değerleri güncellerken herhangi bir hata yükseltmek değildi.

mysql> update auth_user set last_name='Slatkevičiusa' where id=1;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select last_name from auth_user where id=100;
 --------------- 
| last_name     |
 --------------- 
| Slatkevi?iusa | 
 --------------- 
1 row in set (0.00 sec)

PostgreSQL

Başarısız değerleri yukarıda listelenen Django veritabanı arka ucu açıldığında PostgreSQL tabloya güncellenebilir. Garip.

mysql> SHOW CHARACTER SET;
 ---------- ----------------------------- --------------------- -------- 
| Charset  | Description                 | Default collation   | Maxlen |
 ---------- ----------------------------- --------------------- -------- 
...
| utf8     | UTF-8 Unicode               | utf8_general_ci     |      3 | 
...

Ama http://www.postgresql.org/docs/8.1/interactive/multibyte.html, aşağıdaki: buldum

Name Bytes/Char
UTF8 1-4

Unicode char ama MySQL PostgreSQL 4 bayt 3 bayt maxlen var yukarıdaki hata neden yani?

CEVAP
25 Ocak 2011, Salı


Aynı sorun bende de vardı ve sütun karakter setini değiştirerek çözüldü. Veritabanı varsayılan bir karakter utf-8 set olsa bile veritabanı sütunları farklı bir karakter MySQL sahip olması mümkün sanırım. İşte kullandığım komut:

ALTER TABLE database.table MODIFY COLUMN col VARCHAR(255)  CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jeb Corliss

    Jeb Corliss

    17 Kasım 2006
  • MotoManTV

    MotoManTV

    10 Aralık 2009
  • PlayStation

    PlayStation

    16 Aralık 2005