Recibí un extraño mensaje de error cuando intenté guardar first_name, last_name en el modelo auth_user de Django.
Ejemplos fallidos
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
Ejemplos de éxito
user.first_name = u'Marcin'
user.last_name = u'Król'
user.save()
>>> SUCCEED
Configuración de MySQL
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)
Conjunto de caracteres de tabla y colación
La tabla auth_user tiene un conjunto de caracteres utf-8 con la clasificación utf8_general_ci.
Resultados del comando ACTUALIZAR
No generó ningún error al actualizar los valores anteriores a la tabla auth_user mediante el comando UPDATE.
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
Los valores fallidos enumerados anteriormente se pueden actualizar en la tabla PostgreSQL cuando cambié el backend de la base de datos en Django. Es extraño.
mysql> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+-----------------------------+---------------------+--------+
...
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
...
Pero en http://www.postgresql.org/docs/8.1/interactive/multibyte.html , encontré lo siguiente:
Name Bytes/Char
UTF8 1-4
¿Significa que unicode char tiene un máximo de 4 bytes en PostgreSQL pero 3 bytes en MySQL que causó el error anterior?