Django charset和编码

时间:2013-04-11 08:22:34

标签: mysql django encoding tinymce

我正在尝试从/向Mysql数据库存储和查看希腊字符。

我想使用utf8编码我使用以下命令改变我的数据库:

ALTER DATABASE el CHARACTER SET utf8 COLLATE utf8_general_ci

现在,当我尝试创建文章时,我看到以下错误:

error page

当我尝试从我的数据库中获取文章时,我看到类似的内容:

mysql> select * from article_article
    -> ;
+----+------------+----------+-------------+----------------------------------------------------------------------------------+----------+------+-------+-------+--------------+---------------------+---------------------+-----------+
| id | submenu_id | title    | url         | body                                                                             | image_id | hits | votes | grade | publisher_id | time_upload         | last_modified       | published |
+----+------------+----------+-------------+----------------------------------------------------------------------------------+----------+------+-------+-------+--------------+---------------------+---------------------+-----------+
|  1 |          1 | ???????? | ssss-d-ssss | <p>&epsilon;&lambda;&lambda;&eta;&nu;&iota;&kappa;?</p>
<p>&nbsp;</p>
<p>?</p> |        9 |    0 |     0 |   2.5 |            1 | 2013-04-11 10:39:30 | 2013-04-11 11:02:01 |         1 |
+----+------------+----------+-------------+----------------------------------------------------------------------------------+----------+------+-------+-------+--------------+---------------------+---------------------+-----------+
1 row in set (0.00 sec)

我使用tinymce为bodyfield ..(Tinymce保存希腊字符非常糟糕)

我还检查在管理页面中缺少以下内容:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

如何为utf8格式配置django? 我如何为Emding Greek Chars配置tinymce?

编辑:使用mysql命令更改字段的整理解决问题。 在tiny_mce.js中将entity_encodingnamed更改为raw也解决了第二个问题。现在唯一的问题是警告不会消失:(

3 个答案:

答案 0 :(得分:1)

在 Django 设置文件中:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'init_command': "SET NAMES 'utf8mb4';SET sql_mode='STRICT_TRANS_TABLES';",
            'read_default_file': '/platform/auth/mysql.conf',
            'charset': 'utf8mb4',
        },
        'ATOMIC_REQUESTS': True,
    }
}

答案 1 :(得分:0)

在Django设置文件的charset设置的utf8mb4字典中,将OPTIONS选项设置为DATABASES

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'my_db',
        'USER': 'my_user',
        'PASSWORD': 'my_pass',
        'HOST': 'my.host',
        'OPTIONS': {
            'charset': 'utf8mb4'  # This is the important line
        }
    }
}

这些选项将作为参数传递给mysql驱动程序连接函数,该函数通常为mysqlclient。在这里,您可以在文档中看到所有这些参数:

https://mysqlclient.readthedocs.io/user_guide.html#functions-and-attributes

如果您将different driver用于mysql,则可能需要其他选项。

还要确保在MySQL数据库中,列,表或整个数据库的字符集都设置为utf8mb4。有关MySQL中字符集的更多信息,请参见:

MySQL文档:Specifying Character Sets and Collations
MySQL文件:The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding)
堆栈溢出:What is the difference between utf8mb4 and utf8 charsets in MySQL?

顺便说一句,在Django中,正在进行的拉取请求将utf8mb4设置为默认值:https://github.com/django/django/pull/8886

答案 2 :(得分:0)

gitaarik 上面的回答是正确的,经过一些挖掘后对我有用。我为那些在选项字典中使用单独文件的人添加了这个。像这样:

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.mysql',
    'OPTIONS': {
        'read_default_file': '/platform/auth/mysql.conf',
        'charset': 'utf8mb4',
    },
    'ATOMIC_REQUESTS': True,
}

这是我的 mysql.conf。直到我删除了 default-character-set 选项,它才起作用。

database = 'xyz_platform'
user = 'xyz'
password = 'xyzpassword'
default-character-set = 'utf8mb4'    

正确的 mysql.conf 是这样的:

database = 'xyz_platform'
user = 'xyz'
password = 'xyzpassword'