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 Database changed3 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.04 sec) 3 4 mysql> select * from test_main; 5 +----+--------+ 6 | id | value | 7 +----+--------+ 8 | 0 | 北京| 9 +----+--------+10 1 row in set (0.00 sec)11 12 mysql>
哎呦喂,看起来没有问题了呀,那意思是可以用了呗。好吧开始写代码。
1 require 'mysql2'2 client = Mysql2::Client.new(:host => "localhost", :useame => "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 database db_character; 2 Query OK, 1 row affected (0.00 sec) 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> use db_character;2 Database changed3 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 waing (0.08 sec) 3 4 mysql> select * from test_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 Settings 4 # 5 user= mysql 6 pid-file= /var/run/mysqld/mysqld.pid 7 socket = /var/run/mysqld/mysqld.sock 8 port= 3306 9 basedir = /usr10 datadir = /var/lib/mysql11 tmpdir = /tmp12 lc-messages-dir = /usr/share/mysql13 skip-exteal-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 waing (0.07 sec) 3 4 mysql> select * from test_main; 5 +----+-------+ 6 | id | value | 7 +----+-------+ 8 | 0 | ??| 9 | 1 | ??-?? |10 | 2 | ??|11 +----+-------+12 3 rows in set (0.00 sec)
特麽的,还是不行有没有,偶然间我发现了一个问题,
我修改完成以后,这个数据库的字符集和排序规则依然还是latin,好吧。难道我修改的没有作用,我在创建一个数据库在看一下:
1 mysql> create database testagain;2 Query OK, 1 row affected (0.00 sec)
好吧,有点意思。修改了数据库的字符集,已经存在的数据库的字符集是不受影响的,那就单改一下指定数据库的编码格式:
1 mysql> ALTER DATABASE `db_character` character set utf8;2 Query OK, 1 row affected (0.01 sec)
在插入数据来试试:
1 mysql> insert into test_main(id,value) values (3,"北京-北京"); 2 Query OK, 1 row affected, 1 waing (0.01 sec) 3 4 mysql> select * from test_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 SET utf8 COLLATE utf8_bin;2 Query OK, 4 rows affected (0.05 sec)3 Records: 4 Duplicates: 0 Waings: 0
没有惊喜,问题依然存在,
1 mysql> insert into test_main(id,value) values (4,"北京-北京"); 2 Query OK, 1 row affected, 1 waing (0.01 sec) 3 4 mysql> select * from test_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,我发现了这个
数据库,数据表的字符集改过之后,表中的字段的字符集和排序规则确没有更改,那好吧,
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.04 sec)3 Records: 5 Duplicates: 0 Waings: 0
Got it:
1 mysql> insert into test_main(id,value) values (5,"北京-北京"); 2 Query OK, 1 row affected (0.10 sec) 3 4 mysql> select * from test_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的帐号密码:
然后,将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地址
OK.
最后想说一句,凡事都怕认真。
作者:天添
来源链接:https://www.cnblogs.com/fantiantian/p/3468454.html
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。