`
kong1616
  • 浏览: 101498 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mysql 数据库编码问题

阅读更多
编码问题:首先考虑自己的整个web应用流程的编码保持一致

以下从不同的方面总结设置编码的问题:

servlet中设置编码
String shuoming = new String(addrecordForm.getShuoming().getBytes("iso-8859-1"),"utf-8");

String password=new String(request.getParameter("oldpassword").getBytes("8859_1"),"gbk");

request.setCharacterEncoding("GB2312");


jsp页面中

超连接中的编码

tomcat中的server.xml中找到相应标签  加入URIEncoding="对应编码"

<Connector port="8080" protocol="HTTP/1.1"
               maxThreads="150" connectionTimeout="20000"
               redirectPort="8443"  URIEncoding="utf-8" />


mysql中
URL  jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8       在xml文件配置 &amp;=&
    jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8            代码中

SHOW CHARACTER SET;  查看mysql支持的编码


查看系统的字符集和排序方式的设定
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';


建表
CREATE TABLE `t_list` (
  `user_name` varchar(10) default NULL,
  `user_password` varchar(10) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk



在mysql配置文档my.ini
[mysql]
default-character-set=latin1

# created and no character set is defined
default-character-set=latin1





1.在dos环境下,用mysql --default-character-set=utf8 -u root -p 这句话进入mysql~~
     2.mysql> SHOW VARIABLES LIKE 'character_set_%';
                character_set_client   utf8
                character_set_connection utf8
                character_set_database   utf8
                character_set_results    utf8
                character_set_server   utf8
                character_set_system     utf8
        mysql> set character_set_results=gbk;
        mysql> set character_set_client=gbk;
        mysql> SHOW VARIABLES LIKE 'character_set_%';
                character_set_client   gbk
                character_set_connection utf8
                character_set_database   utf8
                character_set_results    gbk
                character_set_server   utf8
                character_set_system     utf8


     3.建数据库、表,如下:
        mysql>create database demo;
        mysql>use demo;
        mysql>create table user ( id int(11) not null auto_increment primary key,
               name varchar(100) not Null , age int)type=MyISAM,default character set utf8;
     insert into user(name,age) values('本职工作',19);
     insert into user(name,age) values('张,22);
     insert into user(name,age) values('王',29);
1)编译MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;
(2)安装MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
(3)启动mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;
(4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;
(5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
(6)在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
(7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;

通常,通过下面的命令查看系统的字符集和排序方式的设定:
     mysql> SHOW VARIABLES LIKE 'character%';

修改默认字符集,使用mysql的命令
     mysql> SET character_set_client = utf8 ;
     mysql> SET character_set_connection = utf8 ;
     mysql> SET character_set_database = utf8 ;
     mysql> SET character_set_results = utf8 ;
     mysql> SET character_set_server = utf8 ;

一般就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:

SET NAMES 'utf8';
它相当于下面的三句指令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

开始前先看提示
MySQL数据库的4.1是一个分水岭,4.1直接支持Unicode,以下版本支持的不好;

MySQL JDBC Driver的3.0.16也是一个分水岭,3.0.16版本会取数据库本身的编码,然后按照该编码转换,这种方式和Oracle的JDBC Driver是一样的。例如你的数据库是GBK编码的话,JDBC Driver就会把数据库里面的取出来的字符串按照GBK往unicode转换,送给JVM。因此正确的设置数据库本身的编码就尤为重要。

MySQL JDBC Driver3.0.16以下的版本则不然,它不会那么智能的根据数据库编码来确定如何转换,它总是默认使用ISO8859-1,因此你必须使用 characterEncoding=GBK来强制他把数据库中取出来的字符串按照GBK来往unicode转换。

因此,使用什么数据库版本,不管是3.x,还是4.0.x还是4.1.x,其实对我们来说不重要,重要的有二:

1) 正确的设定数据库编码,MySQL4.0以下版本的字符集总是默认ISO8859-1,MySQL4.1在安装的时候会让你选择。如果你准备使用UTF- 8,那么在创建数据库的时候就要指定好UTF-8(创建好以后也可以改,4.1以上版本还可以单独指定表的字符集)

2) 使用3.0.16以上版本的JDBC Driver,那么你就不需要再写什么characterEncoding=UTF-8

开始设置:
1.打开WinMysqlAdmin管理器,选择my.ini设置项,在[mysql]段加入一下代码
default-character-set=utf8
设置后重新启动MySQL服务。
再打开 WinMysqlAdmin管理器,选择Variables项,查看一下变量的值是否如下
character_set_server = utf8
character_set_system = utf8
character_set_database = utf8
character_set_client = utf8
character_set_connection = utf8
character_set_results = utf8

collation_connection = utf8_general_ci
collation_database = utf8_general_ci
collation_server = utf8_general_ci

如果不能重启Mysql服务,则可能拼写错误,检查一下
以上变量的值都符合,恭喜你,设置成功

2.Java中调用数据库连接方法如下
jdbc:mysql://192.168.1.210:3306/parkData?useUnicode=true&amp;characterEncoding=utf8
如果驱动使用3.0.16以上版本的JDBC Driver,那么你就不需要再写什么characterEncoding=utf8



这里不建议改,仍保留默认值
也就是说启动 mysql时,如果没指定指定一个默认的的字符集,这个值继承自配置文件中的;
此时 character_set_server 被设定为这个默认的字符集; 当创建一个新的数据库时,
除非明确指定,这个数据库的字符集被缺省设定为 character_set_server; 当选定了一个数据库时,
character_set_database 被设定为这个数据库默认的字符集; 在这个数据库里创建一张表时,
表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集。
这样问题就随之而来了,假如一数据库是gbk编码。如果访问数据库时没指定其的字符集是gbk。
那么这个值将继承系统的latin1,这样就做成mysql中文乱码。
乱码解决方法
要解决乱码问题,首先必须弄清楚自己数据库用什么编码。如果没有指明,将是默认的latin1。
我们用得最多的应该是这3种字符集 gb2312,gbk,utf8。
那么我们如何去指定数据库的字符集呢?下面也gbk为例
【在MySQL Command Line Client创建数据库 】
mysql> CREATE TABLE `mysqlcode` (
    -> `id` TINYINT( 255 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    -> `content` VARCHAR( 255 ) NOT NULL
    -> ) TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> desc mysqlcode;
+---------+-----------------------+------+-----+---------+----------------+
| Field   | Type                  | Null | Key | Default | Extra          |
+---------+-----------------------+------+-----+---------+----------------+
| id      | tinyint(255) unsigned | NO   | PRI |         | auto_increment |
| content | varchar(255)          | NO   |     |         |                |
+---------+-----------------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)
其中后面的TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
就是指定数据库的字符集,COLLATE (校勘),让mysql同时支持多种编码的数据库。
当然我们也可以通过如下指令修改数据库的字符集
alter database da_name default character set 'charset'.
客户端以 gbk格式发送 ,可以采用下述配置:
SET character_set_client='gbk'
SET character_set_connection='gbk'
SET character_set_results='gbk'
这个配置就等价于 SET NAMES 'gbk'。
现在对刚才创建的数据库操作
mysql> use test;
Database changed
mysql> insert into mysqlcode values(null,'php爱好者');
ERROR 1406 (22001): Data too long for column 'content' at row 1
没有指定字符集为gbk,插入时出错
mysql> set names 'gbk';
Query OK, 0 rows affected (0.02 sec)
指定字符集为 gbk
mysql> insert into mysqlcode values(null,'php爱好者');
Query OK, 1 row affected (0.00 sec)
插入成功
mysql> select * from mysqlcode;
+----+-----------+
| id | content   |
+----+-----------+
| 1 | php爱好着 |
+----+-----------+
1 row in set (0.00 sec)
在没有指定字符集gbk时读取也会出现乱码,如下
mysql> select * from mysqlcode;
+----+---------+
| id | content |
+----+---------+
| 1 | php??? |
+----+---------+
1 row in set (0.00 sec)

表类型根据自己需要选,这里选MyISAM(支持全文检索);
整理选择 gbk_chinese_ci 也就是gbk字符集
gbk_bin 简体中文, 二进制。gbk_chinese_ci 简体中文, 不区分大小写。
在刚才创建的数据库插入数据库

再浏览时发现是乱码
为什么呢?是因为数据库为gbk字符集,而我们操作时没有指定为gbk
回到数据库首页

可以看到 mysql 连接校对默认的latin1_bin。我们将其改为gbk_chinese_ci
再插入一条数据。看,这条已经正常了



1 mysql乱码的问题
1.在终端输入命令 sudo gedit /etc/mysql/my.cnf在打开的文件中
找到[client]在下面加入
default-character-set=utf8
找到 [mysqld_safe]在下面加入
default-character-set=utf8
找到[mysqld]在下面加入
default-character-set=utf8
init_connect='SET NAMES utf8'
找到[mysql]在下面加入
default-character-set=utf8

2.(为了安全起见这一步最好执行)在终端输入命令 mysql -u root -p
提示你输入密码: 你的root用户的密码
进入到mysql输入命令set names utf8 //这里只可以是utf8不可以是utf-8,因为linux下的mysql不认识utf-8。

3.重启mysql命令以便让你上面的修改生效
sudo /etc/init.d/mysql restart

4.检查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/ |
+--------------------------+----------------------------+

命令二:show variables like "collation_%"; 出现
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
到此数据库的字符集配置已经完成,当前你在本地的dos窗口创建数据库插入或者查询中文就已经没有问题了!但是
如果连接linux下的mysql通过调用本地的cmd命令执行.sql文件建库或者建表插入数据等操作仍然还是乱码这时
就需要注意!下面是解决办法!
5.这是我hibernate.cfg.xml里面的配置:
<property name="myeclipse.connection.profile">SERVER</property>
<property name="connection.url">jdbc:mysql://192.168.0.6:3306/WishCMS?useUnicode=true&amp;amp;characterEncoding=GBK&amp;amp;autoReconnect=true</property>

<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
注意在连接的后面加上useUnicode=true&amp;amp;characterEncoding=GBK&amp;amp; autoReconnect=true
基本上就解决了连接linux下的mysql通过调用本地的cmd命令执行.sql文件建库或者建表插入数据等操作仍然还是乱码的问题,
如果还出现乱码的话,程序中建数据库的时候就需要指定数据库的默认字符集:
6.建库指定默认字符集
CREATE DATABASE sample
CHARACTER SET utf8
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci
DEFAULT COLLATE utf8_general_ci ;
7.在程序中执行.sql脚本创建数据表的时候也必须指定默认字符集为GBK,格式如下:(这一步很关键,也是必须的,而且我当时并不能指定为utf8
,只能是GBK!)
Runtime rt = Runtime.getRuntime();
Process child = rt.exec("mysql -h "+server+" -u"+user1+" -p"+pwd1+" "+database+" --default-character-set=GBK");
到此乱码问题就已经解决了!
——————————————————————————————————————————————————————————————————————————————
更改存储字符集

主要的思想就是把数据库的字符集有latin1改为gbk,big5,或者utf8; 以下操作必须拥有主机权限。假设当前操作的数据库名为:database
[编辑]
导出

首先需要把数据导为mysql4.0的格式,具体的命令如下: mysqldump -uroot -p --default-character-set=latin1 --set-charset=gbk --skip-opt databse > test.sql

    * --default-characte-set 以前数据库的字符集,这个一般情况下都是latin1的,
    * --set-charset 导出的数据的字符集,这个可以设置为gbk,utf8,或者big5

[编辑]
导入

首先使用下面语句新建一个GBK字符集的数据库(test)

CREATE DATABASE `test` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;

然后把刚才导出的数据导入到当前的数据库中就ok了。

mysql -uroot -p --default-character-set=gbk -f test<test.sql

通过以上的导出和导入就把数据库的字符集改为正确的存储方式了。

总结:这种方案比较麻烦,但相对以后则一直都是使用MySQL“正确”的方式进行存储和数据连接,并且新版本phpMyAdmin不会乱码。
————————————————————————————————————————————
ruby on rails 乱码最终解决方案

ruby on rails 显示乱码

最终解决方案

1、确定MySQL数据库编码是utf8
2、database.yml里面增加encoding: utf8
3、确定rhtml文件编码是UTF-8

4、修改ApplicationController(该文件位于:../app/controllers/application.rb):

class ApplicationController < ActionController::Base
  before_filter :configure_charsets
    def configure_charsets
      @response.headers["Content-Type"] = "text/html; charset=utf-8"
      suppress(ActiveRecord::StatementInvalid) do
          ActiveRecord::Base.connection.execute 'SET NAMES utf8'
      end
    end
end

5、针对表加UTF-8编码(前提是你要使用数据迁移,位于../db/migrate/xxx.rb)

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users, : options => 'CHARSET=utf8' do |t|
      t.column :name, :string
      t.column :password, :string
      t.column :birthday, :datetime
      t.column :email, :string
      t.column :address, :text
    end
  end

  def self.down
    drop_table :users
  end
end 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics