Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 26410|回复: 0

Mysql乱码问题解决历程

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-12 17:50:29 | 显示全部楼层 |阅读模式

       可能是因为看了太多网上的关于这个问题的解决办法,可能当时是我自己没有看明白也或许是情况不一样,反正都没有解决我当初遇到的问题,现在想想可能是自己当初太无知了,第二个原因是原来大多数情况下是在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 changed
    3 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", :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 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 changed
    3 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.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         = /usr
    10 datadir         = /var/lib/mysql
    11 tmpdir          = /tmp
    12 lc-messages-dir = /usr/share/mysql
    13 skip-external-locking
    14 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.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 warning (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  Warnings: 0

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

     1 mysql> insert into test_main(id,value) values (4,"北京-北京");
     2 Query OK, 1 row affected, 1 warning (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  Warnings: 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个操作:

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

     

    来两个小插曲,

    • 我想远程访问数据库,

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

    1 /etc/mysql/my.cnf
    2 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.

     

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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 13:42 , Processed in 0.057871 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表