使用python将波斯语字符串保存到mysql数据库中

时间:2017-09-14 15:06:27

标签: python mysql linux

我有一个包含波斯语字符串的变量,我无法正确地将该字符串保存到数据库中。我正在使用flask for REST API,我从客户端获取字符串。这是我的代码:

@app.route('/getfile',methods=['POST'])
def get_file():
    #check the validity of json format
    if not request.json or not 'FileName' in request.json:
        abort(400)
    if not request.json or not 'FilePath' in request.json:
        abort(400)
    if not request.json or not 'Message' in request.json:
        abort(400)
    #retreive data from request
    filename_=request.json['FileName']
    filepath_=request.json['FilePath']
    message_=request.json['Message']

    try:
        conn = mysql.connector.connect(host=DBhost,database=DBname,user=DBusername,password=DBpassword)
    except:
        return jsonify({'Result':'Error, Could not connect to database.'})

    cursor_ = conn.cursor()
    query_ = "INSERT INTO sms_excel_files VALUES(null,%s,%s,%s,0)"
    data_ =(filename_,Dst_num_file,message_)
    cursor_.execute(query_, data_)
    last_row_id_=cursor_.lastrowid
    conn.commit()

有问题的变量是message_。我可以正确保存英文文本,但不能保存波斯文本。我还在代码的顶部添加了# -*- coding: utf-8 -*-,但这并没有解决问题。但是如果我用波斯语字符串手动填充message_,它就会正确保存到数据库中。此外,如果我只返回message_的值,那就是正确的。

例如,当message_包含字符串'سلام'时,这是插入数据库的内容:

سلام

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

请注意,这是我第一次尝试阅读阿拉伯语/波斯语字符,因此以下信息可能不正确(在将我的测试输出与您在其中显示的波斯字符串进行比较时,我可能会犯错误题)。此外,到目前为止,我从未听说过烧瓶。

说完这个:

1587 1604 1575 1605是代码点序列,表示您在Unicode中显示的波斯语字符串。现在,在HTML中,Unicode代码点(十进制)可以编码为&#xxxx;形式的实体。因此,字符串سلام HTML中中该字符串的允许表示形式之一。

鉴于此,不良行为可能有两个可能的原因:

1)request.json ['Message']已经包含/返回HTML(而不是自然文本)和(由于某种原因我不知道)包含/以HTML实体编码形式返回有问题的字符串。所以这是你应该检查的第一件事。

2)cursor_.execute(...)以某种方式将字符串编码为HTML,从而(由于某种原因,我不知道)将您的字符串编码为HTML实体编码形式。也许您告诉数据库驱动程序将message_中的非ASCII字符编码为HTML实体?

为了进一步分析,您可以检查在request.json['Message']包含/仅返回ASCII字符的测试用例中会发生什么。

如果ASCII字符也作为HTML实体写入数据库,则必须存在一个基本问题,导致所有字符无异常地被编码到HTML实体中。

否则,您最终没有告诉您的数据库,数据库驱动程序或文件系统驱动程序使用哪种编码。在这种情况下,通常会正确处理ASCII字符,而非ASCII字符会发生奇怪的事情。但是,在文件IO或数据库操作期间自动将非ASCII字符编码为HTML实体将是非常不寻常的。但如上所述,我不知道烧瓶......

请参阅MySQL手册,了解如何设置数据库,表,列和连接的字符编码,数据库驱动程序文档,以了解必须执行哪些其他操作才能正确处理此编码,以及解释器和其库的手册,以了解如何正确设置文件IO的编码(CGI通过STDIN / STDOUT工作)。

如果数据库字符编码和文件IO编码完全相同,那么您的生活将变得更加轻松。就个人而言,我总是使用UTF-8。

最后一点:由于我对瓶子一无所知,我不知道# -*- coding: utf-8 -*-应该做什么。但很有可能这个只告诉解释器脚本本身是如何编码的,而不是用于输入/输出/数据库操作的编码

答案 1 :(得分:0)

试试这段代码。它使用的是MySQLdb库,它几乎就像你正在使用的库(在使用之前使用pip安装它)。

我试图以各种可能的方式设置“utf-8”。

    # -*- coding: utf-8 -*-
    import MySQLdb

    # Open database connection
    try:
        db = MySQLdb.connect(host="localhost",
                            user="root",
                            passwd="",
                            db="db_name"
                            #,unix_socket="/opt/lampp/var/mysql/mysql.sock"
                            )
        db.set_character_set('utf8')

        crsr = db.cursor(MySQLdb.cursors.DictCursor)
        crsr.execute('SET NAMES utf8;')
        crsr.execute('SET CHARACTER SET utf8;')
        crsr.execute('SET character_set_connection=utf8;')

    except MySQLdb.Error as e:
        print e