关于MySQL实现指定编码遇到的坑

写在前面

环境:MySQL5.7+,MySQL数据库字符编码实现为utf8,表也为utf8

场景:微信授权获取用户信息(包括昵称)并保存到数据库,有的用户成功了,少数用户却失败了

那么为什么会失败呢?

贴上报错日志

Incorrect string value: '\xF0\x9F\x98\x98\xF0\x9F...' for column 'nickname' at row 1

是因为失败的用户微信昵称中带有emoji符号导致的

剖析:

MySQL支持多种字符编码集,如UTF-8、GB2312、GBK等

可以通过 SHOW CHARSET 命令查看。

通常我们会建议使用 UTF-8 作为默认的字符编码方式。

从上图我们可以看到,MySQL数据库有两套 UTF-8 编码实现。

  • utf8:utf8 编码只支持三个字节以内。在 utf8 编码中,中文是占了3个字节,其他的英文、数字、符号都是占1个字节。但是emoji符号占4个字节,一些比较复杂的文字、繁体字也是占4个字节。
  • utf8mb4:UTF-8编码的完整实现。最多可支持4个字节,所以,可以用来存储emoji符号。

查阅资料,官方解释:

最后

Tips:如果有需要保存emoji符号的字段,记得一定要指定编码为 utf8mb4 。

到此这篇关于一个关于MySQL指定编码实现的小坑的文章就介绍到这了,更多相关MySQL指定编码内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql数据库设置utf-8编码的方法步骤

    修改/etc/my.cnf或者/etc/mysql/my.cnf文件 [client] default-character-set = utf8 [mysqld] default-storage-engine = INNODB character-set-server = utf8 collation-server = utf8_general_ci 重启mysql,使用mysql客户端检查编码 show variables like '%char%'; 创建新数据库时使用UTF-8编码 cre

  • mysql关联两张表时的编码问题及解决办法

    Mysql关联两张表时,产生错误提示Illegal mix of collations 1.先用工具把数据库.两张表的编码方式改变 2.这步很重要,需要改变字段的编码方式. ALTER TABLE `表名` CHANGE `dev_chancode` `字段` VARCHAR(32) CHARACTER SET gbk NOT NULL; 总结:在建表时一定注意统一的编码方式,后续搞来搞去超级麻烦. 如何解决MySQL表编码转换问题 将待导出的数据表的表结构导出(可以用Phpmyadmin.my

  • MySQL编码不一致可能引起的一些问题

    存储过程与编码 MySQL 存储过程中, 表和数据的编码与数据库和存储过程默认的编码不同则可能出现 sql 不会使用索引的情况, 因为 MySQL 会对条件列的数据做相应的编码转换, 比如以下, 表数据为 latin1, MySQL 解析器会做一些转换: ... WHERE namecolumn = NAME_CONST('in_namecolumn',_utf8'MP201022' COLLATE 'utf8_general_ci') 可以在存储过程中进行相应的编码转换(通常修改 varcha

  • MySQL 编码utf8 与 utf8mb4 utf8mb4_unicode_ci 与 utf8mb4_general_ci

    参考:mysql字符集小结 utf8mb4 已成为 MySQL 8.0 的默认字符集,在MySQL 8.0.1及更高版本中将 utf8mb4_0900_ai_ci 作为默认排序规则. 新项目只考虑 utf8mb4 UTF-8 编码是一种变长的编码机制,可以用1~4个字节存储字符. 因为历史遗留问题,MySQL 中的 utf8 编码并不是真正的 UTF-8,而是阉割版的,最长只有3个字节.当遇到占4个字节的 UTF-8 编码,例如 emoji 字符或者复杂的汉字,会导致存储异常. 从 5.5.3

  • 如何更改MySQL数据库的编码为utf8mb4

    utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符. 采用utf8mb4编码的好处是:存储与获取数据的时候,不用再考虑表情字符的编码与解码问题. 更改数据库的编码为utf8mb4: 1. MySQL的版本 utf8mb4的最低mysql版本支持版本为5.5.3+,若不是,请升级到较新版本. 2. MySQL驱动 5.1.34可用,最低不能低于5.1.13 SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%

  • MySQL命令行操作时的编码问题详解

    1.查看MySQL数据库编码 mysql -u用户名 -p密码 show variables like 'char%'; 2.编码解释 1.character_set_client:MySQL会使用该编码来解读客户端发送来的数据,如果该字段编码为utf8,那么如果客户端发送过来的数据不是utf8,就会出现乱码现象. 2.character_set_results:MySQL会把数据转换成该编码后,再发送给客户端,例如该编码为utf8,那么如果客户端不使用utf8来解读,那么就会出现乱码现象. 3

  • 关于MySQL实现指定编码遇到的坑

    写在前面 环境:MySQL5.7+,MySQL数据库字符编码实现为utf8,表也为utf8 场景:微信授权获取用户信息(包括昵称)并保存到数据库,有的用户成功了,少数用户却失败了 那么为什么会失败呢? 贴上报错日志 Incorrect string value: '\xF0\x9F\x98\x98\xF0\x9F...' for column 'nickname' at row 1 是因为失败的用户微信昵称中带有emoji符号导致的 剖析: MySQL支持多种字符编码集,如UTF-8.GB231

  • php使用指定编码导出mysql数据到csv文件的方法

    本文实例讲述了php使用指定编码导出mysql数据到csv文件的方法.分享给大家供大家参考.具体实现方法如下: <?php /* * PHP code to export MySQL data to CSV * * Sends the result of a MySQL query as a CSV file for download * Easy to convert to UTF-8. */ /* * establish database connection */ $conn = mysq

  • MySQL数字类型自增的坑

    在进行表结构设计时,数字类型是最为常见的类型之一,但要用好数字类型并不如想象得那么简单,比如: 怎么设计一个互联网海量并发业务的自增主键?用 INT 就够了? 怎么设计账户的余额?用 DECIMAL 类型就万无一失了吗? 以上全错! 数字类型看似简单,但在表结构架构设计中很容易出现上述"设计上思考不全面"的问题(特别是在海量并发的互联网场景下) 数字类型 整数类型 MySQL 数据库支持 SQL 标准支持的整型类型:INT.SMALLINT.此外,MySQL 数据库也支持诸如 TINY

  • MySql修改数据库编码为UTF8避免造成乱码问题

    mysql 创建数据库时指定编码很重要,很多开发者都使用了默认编码,乱码问题可是防不胜防.制定数据库的编码可以很大程度上避免倒入导出带来的乱码问题. 网页数据一般采用UTF8编码,而数据库默认为latin .我们可以通过修改数据库默认编码方式为UTF8来减少数据库创建时的设置,也能最大限度的避免因粗心造成的乱码问题. 我们遵循的标准是,数据库,表,字段和页面或文本的编码要统一起来 我们可以通过命令查看数据库当前编码: mysql> SHOW VARIABLES LIKE 'character%'

  • MySQL GBK→UTF-8编码转换

    前言: 第一次写教程,其实算不得教程,只是想总结个转换的手记.如果中间有错误,或者办法不够理想,大家回贴研究下. 另外,我也希望我们论坛不仅仅作为闲聊的地方,也希望大家能活跃我们论坛的学习气氛,毕竟我们都来自一个应该给我们知识的地方,不论你从那里获得了多少你需要的知识. 好了,言归正传. 一准备: 环境:MySQL4.1.x及以上版本. Convertz--文本编码转换工具,molyx上介绍的,我采用的.其实这类工具很多. 二理论: MySQL从4.1版本开始内部存储字符集支持了UTF-8,这个

  • 解决spring-data-jpa mysql建表编码问题

    使用InnoDB引擎 UTF8编码 创建配置类: import org.hibernate.dialect.MySQL5InnoDBDialect; import org.hibernate.dialect.MySQLInnoDBDialect; import org.springframework.stereotype.Component; /** * Created by ZXing * QQ:1490570560 */ public class MysqlConfig extends My

  • 更改MySQL数据库的编码为utf8mb4问题

    目录 1. MySQL的版本 2. MySQL驱动 3. 修改MySQL配置文件 4. 重启数据库,检查变量 5. 数据库连接的配置 6. 将数据库和已经建好的表也转换成utf8mb4 utf-8编码可能1个字节.2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持最多3字节的数据,也就是说mysql最开始的时候,对utf-8的支持是不完整的.而emoji表情字符是4个字节的字符. 如果直接往采用utf-8编码的数据库中插入表情数据 java程序中将报SQL异常: java.s

  • java按指定编码写入和读取文件内容的类分享

    可以指定编码如:utf-8来写入和读取文件.如果文件编码未知,可以通过该方法先得到文件的编码后再指定正确的编码来读取,否则会出现文件乱码问题. 如何识别文件编码请参考:java自动根据文件内容的编码来读取避免乱码 复制代码 代码如下: package com.zuidaima.util; import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputS

  • php+mysql删除指定编号员工信息的方法

    本文实例讲述了php+mysql删除指定编号员工信息的方法.分享给大家供大家参考.具体分析如下: 利用php提交员工编号给mysql,然后由mysql把数据接受并利用delete进行数据删除操作了,这里就来给大家分享几个具体例子. delete语句的示例: 复制代码 代码如下: delete from friends where user_name = 'simaopig'; 语法结构中,我们就可以看出,和 update 语法一样,我们是可以省略 where 子句的,不过这是一个很危险的行为,因

  • 详解MySQL导出指定表中的数据的实例

    详解MySQL导出指定表中的数据 要求: 1. 不导出创表的语句,因为表已经建好:默认会导出,先drop table然后create table: 2. 导出的insert语句加上ignore,允许重复执行:默认不会加上ignore: 3. insert语句中列出表中的字段,看得更清楚:默认不会: 4. 分记录生成多条insert语句,修改起来比较容易:默认是一条: 最终结果如下: mysqldump -pxxxxxx qzt qf1_mail_account --no-create-info

随机推荐