菜单

MySQL的中文UTF8乱码问题_Mysql_脚本之家

2019年11月23日 - 数据网络

从MySQL支持Unicode后,为了与时俱进,我们的web程序也开始考虑用UTF8了。其实UTF8也用了好几年了,程序基本能跑,没什么大问题,但是数据倒换的时候,总是遇到不爽的事情。

mysql
创建数据库时指定编码很重要,很多开发者都使用了默认编码,乱码问题可是防不胜防。制定数据库的编码可以很大程度上避免倒入导出带来的乱码问题。
网页数据一般采用UTF8编码,而数据库默认为latin
。我们可以通过修改数据库默认编码方式为UTF8来减少数据库创建时的设置,也能最大限度的避免因粗心造成的乱码问题。我们遵循的标准是,数据库,表,字段和页面或文本的编码要统一起来
我们可以通过命令查看数据库当前编码: mysql> SHOW VARIABLES LIKE
‘character%’; 发现很多对应的都是
latin1,我们的目标就是在下次使用此命令时latin1能被UTF8取代。第一阶段:
mysql设置编码命令 复制代码 代码如下: SET
character_set_client = utf8; SET character_set_connection = utf8;
SET character_set_database = utf8; SET character_set_results = utf8;
SET character_set_server = utf8; 然后 mysql> SHOW VARIABLES LIKE
‘character%’; 你可以看到全变为 utf8 。 但是,这只是一种假象
此种方式只在当前状态下有效,当重启数据库服务后失效。
所以如果想要不出现乱码只有修改my.ini文件, 从my.ini下手 [client]
default-character-set=utf8 [mysql] default-character-set=utf8
[mysqld] default-character-set=utf8
以上3个section都要加default-character-set=utf8,平时我们可能只加了mysqld一项。
然后重启mysql,执行 mysql> SHOW VARIABLES LIKE ‘character%’;
确保所有的Value项都是utf8即可。 但是可恶的事情又来了,
|character_set_client | utf8 | | character_set_connection | utf8 | |
character_set_database | utf8 | | character_set_filesystem | binary
| | character_set_results | utf8 | | character_set_server | latin1 |
| character_set_system | utf8 注意 该配置| character_set_server |
latin1 无法设置成UTF8 交互时候仍然会出现乱码。
第二阶段:找到下面这东东 X:\%path%\MySQL\MySQL Server
5.0\bin\MySQLInstanceConfig.exe
重新启动设置,将默认编码设置为utf8.这样就能达到我们所要的效果了。
mysql> SHOW VARIABLES LIKE ‘character%’;
+————————–+———————————————————+
| 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 |
C:\Program Files\MySQL\MySQL Server 5.0\share\charsets\ |
+————————–+———————————————————+
8 rows in set 另外注意事项:
1、建表时加utf8,表字段的Collation可加可不加,不加时默认是utf8_general_ci了。
复制代码 代码如下: CREATE TABLE
`tablename4` NOT NULL AUTO_INCREMENT, `varchar1` varchar DEFAULT
NULL, `varbinary1` varbinary DEFAULT NULL, PRIMARY KEY ENGINE=MyISAM
DEFAULT CHARSET=utf8 2、网页xxx.php/jsp保存时选择utf8编码,页头最好加上
header(‘conten-type:text/html;charset=utf-8’);
在执行CRUD操作前先执行一下 mysql_query; ————————-
连接数据库设置编码
jdbc:mysql://地址:3306/数据库名?characterEncoding=utf8
————————- java中的常用编码UTF-8;GBK;GB2312;ISO-8859-1;
对应mysql数据库中的编码utf8;gbk;gb2312;latin1

网页xxx.php用EditPlus另存为UTF8格式,MySQL在my.ini里设置default-character-set=utf8,建表时加了CREATE
TABLE `xxx ` ENGINE=MyISAM DEFAULT
CHARSET=utf8,用xxx.php执行insert/update/select出来的都是中文,貌似没问题,但是用phpMyAdmin看select是乱码,用第三方工具软件看select也是乱码,mysqldump也是乱码,很不爽。当然,如果你建表的时候,选择了binary/varbinary/blob类型,不会发现乱码,因为指定的是二进制保存,MySQL保存数据时就没有编码的概念了。

虽然在my.ini里设置default-character-set=utf8,但是执行以下命令时有新发现:

mysql> SHOW VARIABLES LIKE ‘character%’;

+—————————————-+————————-

| Variable_name | Value

+—————————————-+————————-

| character_set_client| latin1

| character_set_connection | latin1

| character_set_database| utf8

| character_set_filesystem | binary

| character_set_results | latin1

| character_set_server | utf8

| character_set_system | utf8

| character_sets_dir | D:\mysql\share\charsets\

+—————————————-+————————-

8 rows in set

mysql> SHOW VARIABLES LIKE ‘collation_%’;

+—————————————+——————

| Variable_name | Value

+—————————————+——————

| collation_connection | latin1_swedish_ci

| collation_database | utf8_general_ci

| collation_server | utf8_general_ci

+————————————–+——————

3 rows in set

发现Value列里面不全是utf8,仍然有部分是latin1,比如其中的client和connection。那网页xxx.php的工作过程就是这样的啦:从xxx.php页面上输入汉字,因为xxx.php是UTF8编码的,所以xxx.php以UTF8格式转换输入的汉字,然后以UTF8提交给mysql,但是mysql的client和connection都是latin1的,而表是UTF8的,所以mysql存储时,先将xxx.php提交的汉字,转成latin1的格式,再转成UTF8字符格式存在表中。如果此时我们用第三方软件或者phpMyAdmin去select查看此表,而表中存储的数据是被latin1过的UTF8字符,出来的时候是以UTF8格式取的,当然看起来时乱码了。解决方法就是让所有过程都是UTF8的就可以了。

1、从my.ini下手

[client]

default-character-set=utf8

[mysql]

default-character-set=utf8

[mysqld]

default-character-set=utf8

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图