mysql的乱码问题解决_Mysql乱码问题解决历程

可能是因为看了太多网上的关于这个问题的解决办法,可能当时是我自己没有看明白也或许是情况不一样,反正都没有解决我当初遇到的问题,现在想想可能是自己当初太无知了,第二个原因是原来大多数情况下是在windows环境下开发,涉及到数据库的时候有专门的DBA负责处理,对于简单的设置或许就用图形管理工具设置,最近自己在鼓捣一个东西的时候是在Linux环境下,如果没有使用phpmyadmin的情况下,这个时候的数据库字符设置问题可能就会有那么一点困难,所以特别想跟大家分享一下这篇随笔,很早就写了,趁今天空闲给贴出来,其中我的办法根本就不是最好的,但是就像我的标题一样,是我自己的解决历程,汗啊。

事情是这样发生的,我用这样一个命令创建了数据库:

1 mysql> create database db_name;2 Query OK, 1 row affected (0.02 sec)

提示创建成功,让我们检查一下:

1 mysql>show databases;2 +--------------------+

3 | Database |

4 +--------------------+

5 | information_schema |

6 | db_name |

7 | mysql |

8 | oaonline |

9 | performance_schema |

10 | phpmyadmin |

11 | test |

12 +--------------------+

13 7 rows in set (0.00 sec)

不错确实成功了,来创建一个表让我们来插入数据吧,

1 mysql> use db_name;2 Databasechanged3 mysql> CREATE TABLE test_main (id INT, value VARCHAR(10), PRIMARY KEY(id));4 Query OK, 0 rows affected (0.17 sec)

同样我们来验证一下:

1 mysql>show tables;2 +-------------------+

3 | Tables_in_db_name |

4 +-------------------+

5 | test_main |

6 +-------------------+

7 1 row in set (0.00 sec)

OK,表已经创建成功了。

下面关键时刻,来插点数据吧:

1 mysql> insert into test_main(value) values("北京");2 Query OK, 1 row affected (0.04sec)3

4 mysql> select * fromtest_main;5 +----+--------+

6 | id | value |

7 +----+--------+

8 | 0 | 北京 |

9 +----+--------+

10 1 row in set (0.00sec)11

12 mysql>

哎呦喂,看起来没有问题了呀,那意思是可以用了呗。好吧开始写代码。

1 require 'mysql2'

2 client = Mysql2::Client.new(:host => "localhost", :username => "root",:password=>"root",:database=>"db_name")3 client.query("INSERT INTO `db_name`.`test_main` (`id` ,`value`)VALUES ('2', '北京');");

OK,看结果也没有问题。

我擦,奇怪啊,原来明明不行的,现在怎么好了呢?(/ □ \),回想一下我对这个数据库做了什么。现在再用一个新的环境重新做一遍:

首先安装一个数据库(当然是在另一台机器上):

1 sudo apt-get install mysql-server

........

安装成功,按照以上测试创建一个测试数据库

1 mysql> create databasedb_character;2 Query OK, 1 row affected (0.00sec)3

4 mysql>show databases;5 +--------------------+

6 | Database |

7 +--------------------+

8 | information_schema |

9 | db_character |

10 | mysql |

11 | performance_schema |

12 | test |

13 +--------------------+

14 5 rows in set (0.00 sec)

然后创建测试表:

1 mysql> usedb_character;2 Databasechanged3 mysql> CREATE TABLE test_main (id INT, value VARCHAR(10), PRIMARY KEY(id));4 Query OK, 0 rows affected (0.64 sec)

来插条数据吧:

1 mysql> insert into test_main(value) values("北京");2 Query OK, 1 row affected, 1 warning (0.08sec)3

4 mysql> select * fromtest_main;5 +----+-------+

6 | id | value |

7 +----+-------+

8 | 0 | ?? |

9 +----+-------+

10 1 row in set (0.00 sec)

OK,乱码啦。

当初我是这样做的,baidu,google,发现有人这么说:

先查看一下这个数据库的字符集:

1 mysql> show variables like 'character%';2 +--------------------------+----------------------------+

3 | Variable_name | Value |

4 +--------------------------+----------------------------+

5 | character_set_client | utf8 |

6 | character_set_connection | utf8 |

7 | character_set_database | latin1 |

8 | character_set_filesystem | binary |

9 | character_set_results | utf8 |

10 | character_set_server | latin1 |

11 | character_set_system | utf8 |

12 | character_sets_dir | /usr/share/mysql/charsets/ |

13 +--------------------------+----------------------------+

14 8 rows in set (0.00 sec)

看到character_set_database,character_set_server的默认字符集是latin1,修改一下默认字符集: 在配置文件/etc/mysql/my.cnf,在[mysqld]中添加character-set-server=utf8

1 [mysqld]

2 #3 # *Basic Settings4 #5 user =mysql6 pid-file = /var/run/mysqld/mysqld.pid7 socket = /var/run/mysqld/mysqld.sock8 port = 3306

9 basedir = /usr10 datadir = /var/lib/mysql11 tmpdir = /tmp12 lc-messages-dir = /usr/share/mysql13 skip-external-locking14 character-set-server=utf8

然后重新启动数据库,再次查看字符集:

1 mysql> show variables like 'character%';2 +--------------------------+----------------------------+

3 | Variable_name | Value |

4 +--------------------------+----------------------------+

5 | character_set_client | utf8 |

6 | character_set_connection | utf8 |

7 | character_set_database | utf8 |

8 | character_set_filesystem | binary |

9 | character_set_results | utf8 |

10 | character_set_server | utf8 |

11 | character_set_system | utf8 |

12 | character_sets_dir | /usr/share/mysql/charsets/ |

13 +--------------------------+----------------------------+

14 8 rows in set (0.00 sec)

这样改过了,我们在添加一条记录:

1 mysql> insert into test_main(id,value) values (1,"北京-北京");2 Query OK, 1 row affected, 1 warning (0.07sec)3

4 mysql> select * fromtest_main;5 +----+-------+

6 | id | value |

7 +----+-------+

8 | 0 | ?? |

9 | 1 | ??-?? |

10 | 2 | ?? |

11 +----+-------+

12 3 rows in set (0.00 sec)

特麽的,还是不行有没有,偶然间我发现了一个问题,

6162e690bee1a40f4c14517934da02f0.png

我修改完成以后,这个数据库的字符集和排序规则依然还是latin,好吧。难道我修改的没有作用,我在创建一个数据库在看一下:

1 mysql> create databasetestagain;2 Query OK, 1 row affected (0.00 sec)

2fcdea957a41bda48ac80622b61e720e.png好吧,有点意思。修改了数据库的字符集,已经存在的数据库的字符集是不受影响的,那就单改一下指定数据库的编码格式:

1 mysql> ALTER DATABASE `db_character` character setutf8;2 Query OK, 1 row affected (0.01 sec)

dc5139ee464be00d0d464fa84232d201.png

在插入数据来试试:

1 mysql> insert into test_main(id,value) values (3,"北京-北京");2 Query OK, 1 row affected, 1 warning (0.01sec)3

4 mysql> select * fromtest_main;5 +----+-------+

6 | id | value |

7 +----+-------+

8 | 0 | ?? |

9 | 1 | ??-?? |

10 | 2 | ?? |

11 | 3 | ??-?? |

12 +----+-------+

13 4 rows in set (0.00 sec)

嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷,OMG,硬着头皮去弄一下吧。我更改了数据库的字符集,也应该改一下表的字符集:

1 mysql> ALTER TABLE `test_main` DEFAULT CHARACTER SETutf8 COLLATE utf8_bin;2 Query OK, 4 rows affected (0.05sec)3 Records: 4 Duplicates: 0 Warnings: 0

没有惊喜,问题依然存在,

1 mysql> insert into test_main(id,value) values (4,"北京-北京");2 Query OK, 1 row affected, 1 warning (0.01sec)3

4 mysql> select * fromtest_main;5 +----+-------+

6 | id | value |

7 +----+-------+

8 | 0 | ?? |

9 | 1 | ??-?? |

10 | 2 | ?? |

11 | 3 | ??-?? |

12 | 4 | ??-?? |

13 +----+-------+

14 5 rows in set (0.00 sec)

Then,我发现了这个

1b6cbaa335faba35c80d710460a7b913.png

数据库,数据表的字符集改过之后,表中的字段的字符集和排序规则确没有更改,那好吧,

1 mysql> ALTER TABLE `test_main` CHANGE `value` `value` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL;2 Query OK, 5 rows affected (0.04sec)3 Records: 5 Duplicates: 0 Warnings: 0

Got it:

1 mysql> insert into test_main(id,value) values (5,"北京-北京");2 Query OK, 1 row affected (0.10sec)3

4 mysql> select * fromtest_main;5 +----+---------------+

6 | id | value |

7 +----+---------------+

8 | 0 | ?? |

9 | 1 | ??-?? |

10 | 2 | ?? |

11 | 3 | ??-?? |

12 | 4 | ??-?? |

13 | 5 | 北京-北京 |

14 +----+---------------+

15 6 rows in set (0.00 sec)

我能小小的总结一下不,不涉及原理,只是归纳一下,在以后如何没有图形管理工具的时候,依然能够正确的设置mysql关于字符集相关的东西。

一:在安装完数据库的时候,先不要创建数据库,先去更改字符集设置。

二:如果在没有设置字符集的时候就创建数据库的时候,如果想更改默认设置就比较麻烦了要做如下3个操作:

更改数据库的字符集设置。

更改数据库中表的字符集设置。

修改数据库中表的相关字段的字符集和所按字符集排序设置。

来两个小插曲,

我想远程访问数据库,

首先更改配置文件中绑定的ip地址:

1 /etc/mysql/my.cnf2 bind-address = 192.168.0.125

然后在mysql中授权,

1 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;2 Query OK, 0 rows affected (0.00 sec)

然后重新启动mysql,即可。

安装PHPMYADMIN

1 sudo apt-get install phpmyadmin

............................

开始安装:选择web容器,数据库,phpmyadmin的帐号密码:

2521c13d44edd8f7ccd9aad32311078f.png

94e9b473244fd5ec3ebb314b787125ef.png

a4ba08501e4a59b28a6f6cdf8cac6069.png

83883a065eb6f4090ebffaf8efe757e5.png

然后,将phpmyadmin连接到apache中,

1 sudo ln -s /usr/share/phpmyadmin /var/www

OK,重启apache:

1 sudo /etc/init.d/apache2 restart

然后验证一下:

在浏览器中请求http://localhost/phpmyadmin  注意localhost部分必须是能够访问数据库的有效主机名或者ip地址

e58105a0e3136c499a4586928b3a520a.png

OK.

最后想说一句,凡事都怕认真。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值