通过表单

时间:2016-02-10 01:26:01

标签: python mysql sql-server forms stored-procedures

我可以使用终端使用mysql成功地将表情符号(即utf8mb4数据)添加到表中。

当我的Python Flask网站尝试将表情符号发送到同一个数据库表和字段时,数据库会返回以下错误的字符串错误:

(1366,“错误的字符串值:'\ xF0 \ x9F \ x98 \ x8E'用于第1行的'p_description'列”

更新

  • 我阅读了建议的线程,但没有看到如何阻止服务器覆盖我的本地字符集服务器设置。
  • 添加了SET NAMES utf8mb4;在INSERT INTO之前,但没有效果
  • 我按照评论中的建议进行了检查(谢谢!),是的,我的所有数据库字符设置都显示了utf8mb4。这是我从mysql获得的:

的MySQL> SHOW VARIABLES WHERE Variable_name LIKE'character_set_%'或Variable_name LIKE'collat​​ion%';

=>

| Variable_name |价值|

| character_set_client | utf8mb4 |

| character_set_connection | utf8mb4 |

| character_set_database | utf8mb4 |

| character_set_filesystem |二进制|

| character_set_results | utf8mb4 |

| character_set_server | utf8mb4 |

| character_set_system | utf8 |

| collat​​ion_connection | utf8mb4_unicode_ci |

| collat​​ion_database | utf8mb4_unicode_ci |

| collat​​ion_server | utf8mb4_unicode_ci |

10行(0.00秒)

我正在使用html表单,jQuery,AJAX和Python Flask将数据发送到数据库。 Python调用下面的SQL存储过程。

存储过程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_addWish`(
    IN p_title varchar(45),
    IN p_description varchar(1000),
    IN p_user_id bigint
)
BEGIN
    SET NAMES utf8mb4; insert into tbl_wish(
        wish_title,
        wish_description,
        wish_user_id,
        wish_date
    )
    values
    (
        p_title,
        p_description,
        p_user_id,
        NOW()
    );
END

**问:如何强制我的网站以utf8mb4格式向我的数据库发送数据?

3 个答案:

答案 0 :(得分:5)

Python Flask默认在MySQL的utf-8中与MySQL通信,即它无法处理完整的utf8mb4范围(包括emojis)。 Flask将覆盖数据库字符集设置,包括my.cf中的字符集服务器设置。将以下设置添加到Flask应用程序通过强制它在utf8mb4中与MySQL通信来解决问题:

app.config ['MYSQL_DATABASE_CHARSET'] ='utf8mb4'

答案 1 :(得分:1)

我最近遇到了几乎相同的问题,其中重音字符导致PHP json_encode()抱怨“格式错误的UTF8字符”。 文档中的许多内容最终导致我在页面底部10.5 Character Set Configuration的一个段落指出:

  

...当character_set_systemcharacter_set_servercharacter_set_client不同时   character_set_system,您手动输入字符(作为数据库   可以显示这些对象标识符,列值或两者   来自客户端或输出本身的输出可能不正确   格式不正确。

事实上,utf8默认为 character_set_server ,而latin1默认为 character_set_server = utf8 - 我不敢推测这是为什么。

我的解决方案是在我的latin1部分明确设置collation_server = utf8_general_ci(默认为latin1_swedish_ci)和[mysqld](默认为my.cnf*_system配置文件然后重启服务。这些设置与相应的character_set_system设置不同的事实显然是我的问题的原因。

某些实验已确认utf8 必须 character_set_database ,否则服务器将无法启动。文档说明character_set_server 可以与data(citytemp) hc <- highchart() %>% hc_xAxis(categories = citytemp$month) %>% hc_add_series(name = "Tokyo", data = citytemp$tokyo) %>% hc_add_series(name = "London", data = citytemp$london) %>% hc_add_series(name = "Other city", data = (citytemp$tokyo + citytemp$london)/2) %>% hc_chart(type = "column", options3d = list(enabled = TRUE, beta = 15, alpha = 15)) hc 设置不同,但我目前没有能力测试其效果。

答案 2 :(得分:0)

如果要将unicode字符存储到数据库中,则需要将列字符集定义为utf8mb4

如果需要,还可以更改表的字符集。

它将帮助您以unicode formate存储数据

由于