mysql存储表情微信昵称

本文介绍了解决MySQL中使用utf8字符集无法正确存储emoji等四字节Unicode字符的问题。通过将数据库及表的字符集升级到utf8mb4,确保了移动应用端评论功能正常运行。


1,去修改表字符集utf8mb4:
ALTER TABLE UGC_REVIEW_CONTENT  CHARSET=utf8mb4 COMMENT='晒单/推荐的评论内容';
执行完后,再在手机端的app测试,依然报同样的错误。


2,再去修改数据库的字符集utf8mb4: 
vim my.cnf
init-connect='SET NAMES utf8mb4'
character-set-server=utf8mb4

重启mysql数据库
[root@mysqlvm4 ~]# service mysql restart
Shutting down MySQL....                                    [确定]
Starting MySQL.............................................[确定]..
[root@mysqlvm4 ~]# 

查看db的字符集 
mysql> show variables like '%char%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | utf8mb4                          |
| character_set_connection | utf8mb4                          |
| character_set_database   | utf8mb4                          |
| character_set_filesystem | binary                           |
| character_set_results    | utf8mb4                          |
| character_set_server     | utf8mb4                          |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)
mysql> 

在手机app端重新评论,输入表情符号,点击提交提示评论成功。

问题分析总结:
    ㈠ 原因
        普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用了,为了应对无线互联网的机遇和挑战、避免 emoji 表情符号带来的问题、涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集,这必须要作为移动互联网行业的一个技术选型的要点
    ㈡ 限制
        需要 >= MySQL 5.5.3版本、从库也必须是5.5的了、低版本不支持这个字符集、复制报错。



.一般来说Mysql(小于5.5.3)字符集设置为utf8,指定连接的字符集也为utf8,django中save unicode string是木有问题的。但是,当字符串中有特殊字符(如emoji表情符号,以及其他凡是转成utf8要占用4字节的字符),就会有问题,会报错Incorrect string value: '\xF0\x9F\x92\x90</...' for column 'xxx' at row 1

大家都知道Unicode是一个标准,utf8是unicode一个实现方式, 某些Unicode字符转成utf8可能4字节,而在MySQl5.5.3之前,utf8最长只有3字节。

mysql> show character set;
+------------+----------------------------+------------------------+----------+
| Charset  | Description                 | Default collation   | Maxlen |
+------------+----------------------------+------------------------+----------+
| utf8          | UTF-8 Unicode          | utf8_general_ci    |      3       |
+------------+----------------------------+------------------------+----------+

所以呢,这个需要4字节才能表示的Unicode字符会被截断,存不进去。


<think> 我们参考了引用内容,特别是引用[2]中展示了如何通过wx.getUserInfo获取用户信息(包括昵称和头像)并发送到服务器的代码示例。 然而,根据引用[1]和引用[3],微信官方已经调整了接口,旧接口(wx.getUserProfile和wx.getUserInfo)将不再支持,需要改用新的方式。 根据引用[3],新的头像获取方式是通过`<button>`组件的`open-type="chooseAvatar"`,而昵称是通过`<input type="nickname">`来获取。 因此,我们需要结合新的API来实现获取用户昵称并保到服务器。注意,获取头像和昵称需要用户主动触发,并且需要用户授权。 步骤: 1. 在wxml中,使用`<input type="nickname">`让用户输入昵称(实际上,这个输入框会弹出微信昵称选择界面,用户可以选择微信昵称或自行输入)。 2. 在js中,我们可以通过绑定input事件来获取用户选择的昵称。 3. 将获取到的昵称通过wx.request发送到服务器。 注意:由于微信调整,我们不再使用wx.getUserInfo来获取昵称,而是通过上述方式。 另外,引用[2]中展示了通过wx.login获取code,然后发送到服务器换取openid等信息的步骤,这部分仍然有效。我们可以结合登录获取的code和用户昵称一起发送到服务器。 具体实现: wxml部分(例如在index.wxml中): ```html <!-- 昵称输入框 --> <input type="nickname" bindinput="onNicknameInput" placeholder="请输入昵称" /> <!-- 其他表单元素,比如保按钮 --> <button bindtap="saveUserInfo">保</button> ``` js部分(例如在index.js中): ```javascript Page({ data: { nickName: '' // 用于存储昵称 }, // 监听昵称输入事件 onNicknameInput: function(e) { // 用户输入或选择昵称后,将值入data this.setData({ nickName: e.detail.value }); }, // 保用户信息到服务器 saveUserInfo: function() { var that = this; // 首先获取登录凭证code wx.login({ success: function(res) { var code = res.code; if (code) { // 发送到服务器 wx.request({ url: 'https://你的服务器域名/保用户信息的接口', method: 'POST', data: { code: code, nickName: that.data.nickName // 这里传递昵称 }, success: function(res) { console.log('保成功', res.data); }, fail: function(error) { console.error('保失败', error); } }); } } }); } }); ``` 服务器端需要做的工作: 1. 接收客户端发送的code和nickName。 2. 使用code、appid和appsecret向微信服务器请求获取openid和session_key。 3. 将openid和nickName存储到数据库中。 注意:由于微信的调整,现在获取用户头像和昵称需要用户主动操作,所以通过这种方式获取的昵称是用户主动提供的,符合微信的规定。 另外,头像的获取需要使用`<button open-type="chooseAvatar">`,并绑定`bindchooseavatar`事件,但问题只要求昵称,所以这里只展示昵称部分。 但是,如果同时需要头像和昵称,那么我们需要分别获取,然后一起上传。这里根据用户需求,只关注昵称。 重要:由于微信的安全策略,服务器域名需要在小程序后台配置,且必须使用https。 参考引用[2]的服务器端代码(PHP)示例,我们可以类似地处理,但注意引用[2]使用的是旧接口获取用户信息,现在我们已经改为新的方式获取昵称。 因此,服务器端代码(以PHP为例)大致如下: ```php <?php // wxLogin.php $code = $_POST['code']; $nickName = $_POST['nickName']; // 注意安全过滤 // 配置你的小程序appid和secret $appid = '你的appid'; $secret = '你的secret'; // 请求微信接口获取openid $url = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code"; $res = file_get_contents($url); $data = json_decode($res, true); $openid = $data['openid']; // 然后可以将openid和nickName入数据库 // ... 数据库操作 ... // 返回成功信息 echo json_encode(array('status'=>1, 'openid'=>$openid, 'nickName'=>$nickName)); ?> ``` 注意:实际应用中需要加入错误处理和安全验证(如过滤用户输入、防止SQL注入等)。 总结:通过新的input组件(type=nickname)获取用户昵称,结合wx.login获取的code,将两者发送到服务器,服务器用code换取openid,然后将openid和昵称存储到数据库。 另外,根据引用[1],旧接口已经不再支持,所以必须使用新的方式。 如果用户需要同时保头像,则需要另外使用chooseAvatar按钮,这里不展开。 相关问题: 1. 微信小程序如何获取用户头像并保到服务器? 2. 微信小程序用户登录的完整流程是怎样的? 3. 如何处理微信小程序中的用户信息更新? </think>### 如何将微信小程序中的微信昵称到服务器 根据微信官方最新规范(2022年10月后),需使用以下步骤实现昵称: #### 方法步骤 1. **前端界面配置** 在 WXML 中使用官方推荐的昵称输入组件: ```html <input type="nickname" placeholder="请输入昵称" bindinput="onNicknameInput" /> ``` 2. **获取用户昵称** 在 JS 文件中监听输入事件: ```javascript Page({ data: { nickName: '' }, // 监听昵称输入事件 onNicknameInput(e) { this.setData({ nickName: e.detail.value }); } }) ``` 3. **用户登录与数据发送** 结合微信登录流程将昵称发送到服务器: ```javascript // 获取登录凭证 wx.login({ success: (res) => { if (res.code) { // 发送数据到服务器 wx.request({ url: 'https://your-server.com/save-nickname', method: 'POST', data: { code: res.code, // 微信登录凭证 nickName: this.data.nickName // 用户昵称 }, success: (res) => { console.log('保成功', res.data); } }); } } }); ``` 4. **服务器端处理**(PHP 示例) ```php <?php $code = $_POST['code']; $nickName = $_POST['nickName']; // 1. 用code换取openid $appid = "YOUR_APPID"; $secret = "YOUR_SECRET"; $url = "https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=$code&grant_type=authorization_code"; $res = json_decode(file_get_contents($url), true); $openid = $res['openid']; // 2. 保到数据库 $db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass'); $stmt = $db->prepare("INSERT INTO users (openid, nickname) VALUES (?, ?) ON DUPLICATE KEY UPDATE nickname=?"); $stmt->execute([$openid, $nickName, $nickName]); ?> ``` #### 关键注意事项 1. **接口变更** 旧接口 `wx.getUserInfo` 已停用,必须使用新的 `type="nickname"` 输入组件获取昵称[^1][^3]。 2. **用户授权** 昵称获取需用户主动输入,首次使用时会触发微信昵称授权弹窗。 3. **数据安全** - 敏感数据(如 openid)应通过 HTTPS 传输 - 服务器需验证 code 有效性防止伪造请求 - 昵称存储前建议做 XSS 过滤 4. **用户体验** 建议在保后使用 `wx.setStorageSync` 本地缓昵称,避免重复获取: ```javascript wx.setStorageSync('nickName', this.data.nickName); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值