linux mysql字符集_linux中mysql的字符集问题总结

在mysql无法插入中文一文中所遇到的问题,在其他的博客上看到很多解决办法,但是很多试了一下并不能解决问题,这里进行总结一下方法和可能出现的情况:

1.修改my.cnf改变编码

shell> vim /etc/mysql/my.cnf

5.5以前系统,在【client】下面加入 default-character-set=utf8

[client]

default-character-set=utf8

5.5以后系统,如下修改:

[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%';

+--------------------------+---------------------------------+

| Variable_name | Value |

+--------------------------+---------------------------------+

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | /usr/soft/mysql/share/charsets/ |

+--------------------------+---------------------------------+

8 rows in set (0.00 sec)

mysql> use test;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show variables like 'char%';

+--------------------------+---------------------------------+

| Variable_name | Value |

+--------------------------+---------------------------------+

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | latin1 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | /usr/soft/mysql/share/charsets/ |

+--------------------------+---------------------------------+

8 rows in set (0.00 sec)

全局的character_set_database编码确实是已经修改了,但是具体到之前已经建好的数据库,他的编码并没有修改,插入依旧是有问题的。

重新创建数据库,建表,发现创建出来的数据库和表默认编码都修改过来了

mysql> create database coding;

Query OK, 1 row affected (0.00 sec)

mysql> show variables like 'char%';

+--------------------------+---------------------------------+

| Variable_name | Value |

+--------------------------+---------------------------------+

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | /usr/soft/mysql/share/charsets/ |

+--------------------------+---------------------------------+

8 rows in set (0.00 sec)

//创建数据库表,不设置编码,即使用默认编码

mysql> create table t1(id int not null, name varchar(100));

Query OK, 0 rows affected (0.02 sec)

//查看数据库表的编码

mysql> show table status like 't1'\G

*************************** 1. row ***************************

Name: t1

Engine: InnoDB

Version: 10

Row_format: Compact

Rows: 0

Avg_row_length: 0

Data_length: 16384

Max_data_length: 0

Index_length: 0

Data_free: 0

Auto_increment: NULL

Create_time: 2019-07-28 16:36:26

Update_time: NULL

Check_time: NULL

Collation: utf8_general_ci

Checksum: NULL

Create_options:

Comment:

1 row in set (0.00 sec)

//查看数据库表中的字段编码

mysql> show full columns from t1\G

*************************** 1. row ***************************

Field: id

Type: int(11)

Collation: NULL

Null: NO

Key:

Default: NULL

Extra:

Privileges: select,insert,update,references

Comment:

*************************** 2. row ***************************

Field: name

Type: varchar(100)

Collation: utf8_general_ci

Null: YES

Key:

Default: NULL

Extra:

Privileges: select,insert,update,references

Comment:

2 rows in set (0.00 sec)

这样看来,修改my.cnf是对今后所创建的数据库起作用,修改的是mysql默认的字符集,但是不能修改已经创建好的数据库编码,已经创建好的需要重新进行修改。这里建议在修改了单个数据库之后,最好是将全局的默认编码也一并改过来,省的以后在出现相似的问题

2.通过set方法修改数据库编码后,重启服务编码又变回原来的编码

通过SET character_set_database = utf8;修改了字符集之后,重新建表发现表的Collation还是latin1_swedish_ci,重启mysql服务发现数据库的编码又变回原来的编码了

以下通过四种方式进行查验:

mysql> set character_set_database = utf8;

Query OK, 0 rows affected (0.00 sec)

通过系统参数查看数据库编码方式

//第一种方式:查看数据库字符集、排序规则。(需要切换默认数据库)

mysql> use test;

Database changed

mysql> show variables like 'char%';

+--------------------------+---------------------------------+

| Variable_name | Value |

+--------------------------+---------------------------------+

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | /usr/soft/mysql/share/charsets/ |

+--------------------------+---------------------------------+

8 rows in set (0.01 sec)

//第二种查看方式

mysql> show create database test\G

*************************** 1. row ***************************

Database: test

Create Database: CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */

1 row in set (0.00 sec)

//第三种查看方式

mysql> SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE schema_name="test"\G

*************************** 1. row ***************************

SCHEMA_NAME: test

DEFAULT_CHARACTER_SET_NAME: latin1

DEFAULT_COLLATION_NAME: latin1_swedish_ci

1 row in set (0.00 sec)

//第四种查看方式

mysql> SELECT @@character_set_database, @@collation_database;

+--------------------------+----------------------+

| @@character_set_database | @@collation_database |

+--------------------------+----------------------+

| utf8 | utf8_general_ci |

+--------------------------+----------------------+

1 row in set (0.00 sec)

通过上面可以发现,通过set character_set_database可以将系统数据中的编码信息修改过来,但是创建数据库语句和information_schema中的信息并没有修改,编码依旧是latin1;

完全修改数据库编码可以通过下面的方式修改:

//修改数据库编码

mysql> alter database test default character set utf8 collate utf8_general_ci;

Query OK, 1 row affected (0.00 sec)

//查看数据编码是否修改过来

//第一种查看方式

mysql> show variables like 'char%';

+--------------------------+---------------------------------+

| Variable_name | Value |

+--------------------------+---------------------------------+

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | /usr/soft/mysql/share/charsets/ |

+--------------------------+---------------------------------+

8 rows in set (0.01 sec)

//第二种查验方式

mysql> show create database test\G

*************************** 1. row ***************************

Database: test

Create Database: CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */

1 row in set (0.00 sec)

//第三种查看方式

mysql> SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE schema_name="test"\G

*************************** 1. row ***************************

SCHEMA_NAME: test

DEFAULT_CHARACTER_SET_NAME: utf8

DEFAULT_COLLATION_NAME: utf8_general_ci

1 row in set (0.00 sec)

//第四种查看方式

mysql> SELECT @@character_set_database, @@collation_database;

+--------------------------+----------------------+

| @@character_set_database | @@collation_database |

+--------------------------+----------------------+

| utf8 | utf8_general_ci |

+--------------------------+----------------------+

1 row in set (0.00 sec)

//创建表进行查看,发现新创建的表的编码正确

mysql> create table t4(id int,name varchar(100));

Query OK, 0 rows affected (0.02 sec)

mysql> show table status like 't4'\G

*************************** 1. row ***************************

Name: t4

Engine: InnoDB

Version: 10

Row_format: Compact

Rows: 0

Avg_row_length: 0

Data_length: 16384

Max_data_length: 0

Index_length: 0

Data_free: 0

Auto_increment: NULL

Create_time: 2019-07-28 17:08:09

Update_time: NULL

Check_time: NULL

Collation: utf8_general_ci

Checksum: NULL

Create_options:

Comment:

1 row in set (0.00 sec)

从上面可以看出,通过这种方式进行修改可以同时将数据库字符集完全修改过来

3.数据库的字符集等都没有问题,但还是插入失败

此时可以考虑一下是否是本地终端的问题,通过env指令查看,找到LANG字段,如果不是en_US.UTF-8可能也会造成无法输入中文:

LANG=en_US.UTF-8

通过一下方式修改

export LANG=en_US.UTF-8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值