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

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

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

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

 mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db_name |
| mysql |
| oaonline |
| performance_schema |
| phpmyadmin |
| test |
+--------------------+
7 rows in set (0.00 sec)

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

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

同样我们来验证一下:

 mysql> show tables;
+-------------------+
| Tables_in_db_name |
+-------------------+
| test_main |
+-------------------+
1 row in set (0.00 sec)

OK,表已经创建成功了。

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

 mysql> insert into test_main(value) values ("北京");
Query OK, 1 row affected (0.04 sec) mysql> select * from test_main;
+----+--------+
| id | value |
+----+--------+
| 0 | 北京 |
+----+--------+
1 row in set (0.00 sec) mysql>

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

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

OK,看结果也没有问题。

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

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

 sudo apt-get install mysql-server

........

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

 mysql> create database db_character;
Query OK, 1 row affected (0.00 sec) mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db_character |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)

然后创建测试表:

 mysql> use db_character;
Database changed
mysql> CREATE TABLE test_main (id INT, value VARCHAR(10), PRIMARY KEY(id));
Query OK, 0 rows affected (0.64 sec)

来插条数据吧:

 mysql> insert into test_main(value) values ("北京");
Query OK, 1 row affected, 1 warning (0.08 sec) mysql> select * from test_main;
+----+-------+
| id | value |
+----+-------+
| 0 | ?? |
+----+-------+
1 row in set (0.00 sec)

OK,乱码啦。

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

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

 mysql> show variables like 'character%';
+--------------------------+----------------------------+
| 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 | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
rows in set (0.00 sec)

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

 [mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
character-set-server=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 | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

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

 mysql> insert into test_main(id,value) values (1,"北京-北京");
Query OK, 1 row affected, 1 warning (0.07 sec) mysql> select * from test_main;
+----+-------+
| id | value |
+----+-------+
| 0 | ?? |
| 1 | ??-?? |
| 2 | ?? |
+----+-------+
3 rows in set (0.00 sec)

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

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

 mysql> create database testagain;
Query OK, 1 row affected (0.00 sec)

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

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

在插入数据来试试:

 mysql> insert into test_main(id,value) values (3,"北京-北京");
Query OK, 1 row affected, 1 warning (0.01 sec) mysql> select * from test_main;
+----+-------+
| id | value |
+----+-------+
| 0 | ?? |
| 1 | ??-?? |
| 2 | ?? |
| 3 | ??-?? |
+----+-------+
4 rows in set (0.00 sec)

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

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

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

 mysql> insert into test_main(id,value) values (4,"北京-北京");
Query OK, 1 row affected, 1 warning (0.01 sec) mysql> select * from test_main;
+----+-------+
| id | value |
+----+-------+
| 0 | ?? |
| 1 | ??-?? |
| 2 | ?? |
| 3 | ??-?? |
| 4 | ??-?? |
+----+-------+
5 rows in set (0.00 sec)

Then,我发现了这个

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

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

Got it:

 mysql> insert into test_main(id,value) values (5,"北京-北京");
Query OK, 1 row affected (0.10 sec) mysql> select * from test_main;
+----+---------------+
| id | value |
+----+---------------+
| 0 | ?? |
| 1 | ??-?? |
| 2 | ?? |
| 3 | ??-?? |
| 4 | ??-?? |
| 5 | 北京-北京 |
+----+---------------+
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
 sudo apt-get install phpmyadmin

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

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

然后,将phpmyadmin连接到apache中,

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

OK,重启apache:

 sudo /etc/init.d/apache2 restart 

然后验证一下:

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

OK.

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

Mysql乱码问题解决历程的更多相关文章

  1. mac上mysql乱码问题解决

    一.mysql出现乱码问题: 出现的问题是下图这样的乱码问题,我是使用java在做练习的时候发现出现字符集编码问题的: 当时是使用jdbc来添加的数据,我的jdbc包括web前端后端的编码都是设置的是 ...

  2. mysql乱码问题解决办法

    最近开发一下小项目,遇到了最常见的乱码问题. 1.数据库使用utf-8  utf-8_generic_ci编码,使用csv上传并导入数据,插入数据的时候出现了问题,有很大部分数据没有被导入,所以使用m ...

  3. [转]mysql 乱码问题解决终结

    http://www.th7.cn/db/mysql/2011-07-07/9217.shtml 查看 MYSQL的字符设置,在SQL查询界面输入 SHOW VARIABLES LIKE 'chara ...

  4. MySQL 乱码问题解决

    修改 配置文件 只需留下 my.ini文件,然后修改其编码配置. 配置如下 # Example MySQL config file for large systems. # # This is for ...

  5. ubuntu mysql emma中文乱码问题解决

    ubuntu mysql emma中文乱码问题解决 emma默认用apt-get 安装的话,emma是不支持中文的,配置文件或直接修改emma程序源文件(python). apt-get安装emma ...

  6. MySQL之乱码问题解决详解

    今天在写一个项目的时候,在数据库中手动插入数据不会产生中文乱码,但是通过javaWeb却出现乱码,把提交表单和响应中的乱码问题解决后,还是乱码.所以我锁定一定是我的mysql数据库中出现了乱码的现象.

  7. linux下的mysql乱码问题

    1,承接上一随笔,因为我用的是rmp的两种反式. rpm -ivh MySQL-server-4.0.14-0.i386.rpm rpm -ivh MySQL-client-4.0.14-0.i386 ...

  8. Linux中mysql乱码问题

    注意: 关于utf8和gbk的区别详细见:linux中文乱码问题解决办法 http://www.linuxidc.com/Linux/2010-04/25757.htm ,下面的配置中根据自己要求选择 ...

  9. CentOS(Linux)中解决MySQL乱码

    环境:CentOS 6.3.mysql5.1 Centos 6.3在上安装mysql client和server之后,出现乱码,不得不修改编码. 注意: 关于utf8和gbk的区别详细见:linux中 ...

随机推荐

  1. RF、GBDT、XGBOOST常见面试算法整理

    1.  RF(随机森林)与GBDT之间的区别 相同点: 1)都是由多棵树组成的 2)最终的结果都是由多棵树一起决定 不同点: 1)  组成随机森林的树可以是分类树也可以是回归树,而GBDT只由回归树组 ...

  2. 第一次接触php

    一.什么是PHP PHP的中文意思:超文本预处理器,英文名字: HyperText Preprocessor. PHP通常有两层含义: (1)PHP是一个编程语言. (2)PHP是处理PHP编程语言的 ...

  3. leetcode 【 Find Peak Element 】python 实现

    题目: A peak element is an element that is greater than its neighbors. Given an input array where num[ ...

  4. MOCTF-火眼金睛

    MOCTF-火眼金睛 http://119.23.73.3:5001/web10/ 把这个题目当作python爬虫来练习. 首先要获取到文本框里面的全部信息, import requests impo ...

  5. Oracle 查看锁定对象 解锁

    一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库.现在提供一种方法解决这种问题,那就是在ORACLE中杀不 ...

  6. [oldboy-django][2深入django]学生管理(Form)-- 编辑(设置input标签属性,设置input标签默认显示值,设置input的类型)

    1 django 后台实现设置input标签属性,设置input标签默认显示值,设置input输入框类型 # Form生成html标签 a. 通过Form生成Input输入框,Form标签,以及sub ...

  7. [oldboy-django][2深入django]班级管理(Form)--查看

    1 需求:django实现班级管理:查看(分页): 数据库采用django自带的sqlite3 2 数据库表创建 from django.db import models class Classes( ...

  8. JS判断是否是IE浏览器的几种方式

    1.得到浏览器的信息,返回由客户机发送服务器的 user-agent 头部的值. if(navigator.userAgent.indexOf("MSIE 8.0")>0){ ...

  9. [JSOI2012][bzoj4332] 分零食 [FFT]

    题面 传送门 思路 首先,这个数据如果没有这么大,我们还是可以做朋友的...... 设$dp\left[i\right]\left[j\right]$代表前j个零食分给了前i个人的方案数 那么dp方程 ...

  10. Linux 程序编译过程的来龙去脉

    大家肯定都知道计算机程序设计语言通常分为机器语言.汇编语言和高级语言三类.高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类 ...