Mysql 字符集

背景:

最近在一个项目,在往数据库写入数据时报错报错如下:

Cause: java.sql.SQLException: Incorrect string value: ‘\xF0\xA3\xBD\x8A’ for column ‘PERSON_NAME’ at row 1604

java.util.concurrent.ExecutionException: org.springframework.jdbc.UncategorizedSQLException: 
### Error updating database.  Cause: java.sql.SQLException: Incorrect string value: '\xF0\xA3\xBD\x8A' for column 'PERSON_NAME' at row 1604
### The error may exist in URL [jar:file:/do1cloud/znmh/dqsf-share-datasync/dqsf-share-datasync.jar!/BOOT-INF/lib/dqsf-share-datasync-core-2.1.2-SNAPSHOT.jar!/mapper/dqsfdatasync/TbQyUserInfoDao.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: INSERT INTO tb_qy_user_info(`ID`, `USER_ID`, `ORG_ID`, `USER_NAME`, `person_name`, `PINYIN`, `mark`,         `address`, `MOBILE`, `SHOR_MOBILE`, `EMAIL`, `birthday`, `SEX`, `company`, `DEPT_ID`, `POSITION`, `UPDATE_TIME`,         `USER_STATUS`, `head_pic`, `weixin_num`, `qq_num`, `create_person`, `create_time`, `is_concerned`, `follow_time`,         `cancel_time`, `wx_user_id`, `corp_id`, `lunar_calendar`, `nick_name`, `phone`, `remind_type`, `entry_time`,         `leave_time`, `leave_remark`, `is_leader`, `IS_TOP`, `CERTIFICATE_TYPE`, `CERTIFICATE_CONTENT`, `identity`, `attribute`, `has_child`, `user_no` ,`sync_wx`) VALUES                        (

原因是由于插入数据的字符集与表结构的默认字符集不匹配导致的这个问题。

简介:

MySQL提供了不同级别的设置,包括server级、database级、table级、column级,可以提供非常精准的设置。
什么是字符集、字符序?简单的来说:

  • 字符集(character set):定义了字符以及字符的编码。
  • 字符序(collation):定义了字符的比较规则。

1、server级(mysql设置)

用途:当你创建数据库,且没有指定字符集、字符序时,server字符集、server字符序就会作为该数据库的默认字符集、排序规则。

1.1、查看server字符集、字符序

分别对应character_set_server、collation_server两个系统变量。

mysql> SHOW VARIABLES LIKE "character_set_server";
mysql> SHOW VARIABLES LIKE "collation_server";

在这里插入图片描述

1.2、修改字符集

1.2.1、配置文件指定

在mysql配置文件中设定,修改后需要重启

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
1.2.2、运行时修改

例子:运行时修改(重启后会失效,如果想要重启后保持不变,需要写进配置文件里)

mysql> SET character_set_server = utf8 ;

2、database级(数据库)

用途:指定数据库级别的字符集、字符序。同一个MySQL服务下的数据库,可以分别指定不同的字符集/字符序。

2.1、查看数据库的字符集/字符序

查看数据库的字符集/字符序

例子一:查看test_schema的字符集、排序规则。(需要切换默认数据库)

mysql> use test_schema;
Database changed
mysql> SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8   | utf8_general_ci |
+--------------------------+----------------------+
1 row in set (0.00 sec)

2.2、设置数据的字符集/字符序

可以在创建、修改数据库的时候,通过CHARACTER SET、COLLATE指定数据库的字符集、排序规则。

创建数据库:

CREATE DATABASE db_name
 [[DEFAULT] CHARACTER SET charset_name]
 [[DEFAULT] COLLATE collation_name]

修改数据库:

ALTER DATABASE db_name
 [[DEFAULT] CHARACTER SET charset_name]
 [[DEFAULT] COLLATE collation_name]

3、table级(表设置)

若明确了建表的字符集和字符序则使用自定义的字符集,若建表时没有明确则使用数据库的字符集,若数据库未明确则使用server级字符集以此类推。

3.1、查看表字符集

通过SHOW CREATE TABLE确认。

mysql> SHOW CREATE TABLE test_table;
+------------+----------------------------------------------------------------------------------------------------------------+
| Table | Create Table             |
+------------+----------------------------------------------------------------------------------------------------------------+
| test_table | CREATE TABLE `test_table` (
 `id` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+------------+----------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

3.2、创建表、修改表的语法如下,可通过CHARACTER SET、COLLATE设置字符集、字符序。

CREATE TABLE tbl_name (column_list)
 [[DEFAULT] CHARACTER SET charset_name]
 [COLLATE collation_name]]

ALTER TABLE tbl_name
 [[DEFAULT] CHARACTER SET charset_name]
 [COLLATE collation_name]

4、column级(列设置)

类型为CHAR、VARCHAR、TEXT的列,可以指定字符集/字符序,语法如下:

4.1、查看表column字符集

show full columns from {tablename};

4.2、修改表column字符集

mysql> ALTER TABLE test_table ADD COLUMN char_column VARCHAR(25) CHARACTER SET utf8;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值