MySQL数据库字符集utf8如何转utf8mb4
这⼏天开发的项⽬需要把Emoji 表情保存到数据库,原来的Mysql数据库的编码是utf8的,这就导致保存的时候报如下错误:
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x95\' for column…………
mysql的utf8并不是真正意义上的utf8,mysql的utf8只⽀持最长三个字节,所以Emoji 表情和有些⽣僻字以及任何新增的 Unicode 字符等如果超过三个字节⽤utf8字符集保存是会报错的。mysql在5.5.3之后增加了utf8mb4这个字符集,mb4就是most bytes 4的意思,专门⽤来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。
为了获取更好的兼容性,应该总是使⽤ utf8mb4 ⽽⾮ utf8. 对于 CHAR 类型数据,utf8mb4 会多消耗⼀些空间,根据 Mysql 官⽅建议,使⽤ VARCHAR 替代 CHAR。
因为mysql的char列类型在utf8mb4下, 为了保证所有的数据都存的下, char将会占⽤字符数*4的字节数 (mysql的char列类型utf8将占⽤字符数*3的字节数), 以保证空间分配⾜够. 所以建议⽤可变长度varchar, 以节省空间. 可变长度消耗的存储空间为: 实际存储需要的字节数+1或2个字节表达的长度。
使⽤utf8mb4要求:
1 1.MySQL版本要求:不低于5.5.3(mysql是在5.5.3之后增加了utf8mb4这个字符集)
2 2.JDBC驱动版本要求:mysql connector版本⾼于5.1.13
可以使⽤如下sql查看数据库及服务器的字符集/编码集情况:
1show variables like '%character%';
2show variables like 'collation%';
将数据库和已经建好的表也转换成utf8mb4
更改数据库编码(字符集):ALTER DATABASE DATABASE_NAME DEFAULT CHARACTER SET utf8mb4 COLLATE
utf8mb4_general_ci;
更改表编码(字符集)(注意:这⾥修改的是表的字符集,表⾥⾯字段的字符集并没有被修改):ALTER
TABLE TABLE_NAME DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
更改表编码(字符集)和表中所有字段的编码(字符集):
ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
批量修改表和表字段编码的⽅法:
修改字符集为utf8mb4的sql语句如下(下⾯的语句只对当前session有效,是临时性的,永久性的请修改MySQL配置⽂件):
1/*来⾃客户端的语句的字符集*/
2set character_set_client = utf8mb4;
3/*建⽴连接使⽤的字符集*/
4set character_set_connection = utf8mb4;
5/*默认数据库使⽤的字符集。当默认数据库更改时,服务器则设置该变量。如果没有默认数据库,变量的值同character_set_server*/
6set character_set_database = utf8mb4;
7/*⽤于向客户端返回查询结果的字符集*/
8set character_set_results = utf8mb4;
9/*服务器的默认字符集*/
10set character_set_server=utf8mb4;
修改MySQL配置⽂件
(修改MySQL配置⽂件是后⾯操作另外⼀个库的时候补充上来的,所以这⾥的utf8mb4_unicode_ci和下⾯截图中的
utf8mb4_general_ci,有不⼀致的地⽅,朋友们根据⾃⼰的需求设置就是了。utf8mb4_unicode_ci和utf8mb4_general_ci的区别只是排序规则的不同,字符集都是utf8mb4,排序规则根据⾃⾝需求选择即可)
修改mysql配置⽂件myf(windows为my.ini,我的windows下my.ini⽂件在C:\ProgramData\MySQL\MySQL Server 5.7⽬录)
我的myf放在/etc/myf位置。到后请在以下三部分⾥添加如下内容:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
截图如下(最后⼀句是忽略表名⼤⼩写的,有需要的可以配置上):
修改完成后记得重启mysql:
Linux:
1service mysql restart
2或者
3service mysqld restart
Windows:
1net stop mysql
2
3net start mysql
停⽌命令:net stop mysql
启动命令:net start mysql
不同的操作系统重启数据库⽅式不同,如果以上命令不管⽤,请根据操作系统在⽹上搜索命令
修改前的数据库和服务器字符集我没有截图保存,下⾯贴上修改后的截图
下⾯贴上上⾯各个参数的解释:
1character_set_client
2来⾃客户端的语句的字符集。
3
4
5character_set_connection
6建⽴连接使⽤的字符集。
7
8
9character_set_database
10默认数据库使⽤的字符集。当默认数据库更改时,服务器则设置该变量。如果没有默认数据库,变量的值同character_set_server 11
12
13character_set_results
14⽤于向客户端返回查询结果的字符集。
15
16
17character_set_ server
18服务器的默认字符集。
19
下载mysql服务端命令20
21character_set_system
22服务器⽤来保存识别符的字符集。该值⼀定是utf8。
23
24
25character_sets_dir
26字符集安装⽬录。
27
28
29collation_connection
30连接字符集的校对规则。
31
32
33collation_database
34默认数据库使⽤的校对规则。当默认数据库改变时服务器则设置该变量。如果没有默认数据库,变量的值同collation_server。35
36
37collation_server
38服务器的默认校对规则。
程序重新连接数据库,应该是可以保存成功了。
如果修改完成后,代码中保存还是报错的话那就要修改连接数据库的配置了。
本⼈使⽤的是阿⾥巴巴的druid数据库连接池:
我在中新增了如下配置:
1<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" abstract="true">
2 <!-- 其他的与本次换字符集⽆关的配置我就不贴上来了 -->
3 <!-- 物理连接初始化的时候执⾏的sql -->
4 <property name="connectionInitSqls" value="set names utf8mb4;"/>
5</bean>
jdbc数据库连接参数设置:
删除了如下参数:useUnicode\=true&characterEncoding\=utf-8
characterEncoding=utf8其实是会⾃动识别为utf8mb4,也可以不加这个参数,会⾃动检测。
⽽autoReconnect=true是必须加上的。
如果本⽂有什么错误的地⽅烦请指出!
如果有问题可以留⾔,希望本⽂可以帮助有需要的⼈。记得点赞哟!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论