编码问题:首先考虑自己的整个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&characterEncoding=UTF-8 在xml文件配置 &=&
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&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;characterEncoding=GBK&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;characterEncoding=GBK&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
分享到:
相关推荐
解决MySQL数据库中的乱码问题需要从多个方面入手,包括但不限于调整应用程序的编码设置、优化数据库配置、确保数据传输过程中的编码一致性等。通过对以上几个案例的分析,我们可以看出,在开发过程中,确保各个层级...
### 解决MYSQL数据库乱码问题 #### 背景与问题描述 在使用Navicat连接MySQL数据库的过程中,用户可能会遇到一个常见的问题:乱码。这种情况通常发生在字符集设置不一致或者配置不当的情况下,尤其是在使用MySQL ...
MySQL数据库中的乱码问题是一个常见的技术难题,尤其在处理多语言环境或者跨平台的数据交互时。乱码通常出现在数据的存储、检索或者显示过程中,这可能是由于编码设置不一致所导致的。以下是一些关于如何解决MySQL...
### Linux 下 MySQL 数据库乱码问题详解 #### 一、问题背景及原因分析 在 Linux 系统中使用 MySQL 数据库时,可能会遇到字符集不匹配导致的数据乱码问题。通常这种现象表现为数据库中的文本数据无法正确显示或存储...
MySQL数据库编码问题涉及到字符集的选择、配置以及数据的迁移和处理。字符集是决定数据库中存储和检索文本数据的方式,对于多语言支持和数据迁移至关重要。UTF-8是一种广泛使用的多字节字符编码,支持全球大部分语言...
综上所述,解决ASP连接MySQL数据库时的乱码问题需要从多个角度考虑,包括但不限于数据库配置、ASP代码、文件编码、浏览器设置等。在调试过程中,逐个排查这些因素,往往能找出问题所在并修复。通过共享已验证的解决...
MySQL数据库系统中文乱码问题及解决方案 MySQL数据库系统中文乱码问题是指在使用MySQL数据库系统时,中文字符在存储、传输和显示过程中出现乱码的问题。这种问题的出现是由于字符集和编码方式的不兼容所致。 在...
MySQL 数据库字符乱码问题是数据库管理中常见的问题之一。造成乱码的原因多种多样,可能是由于数据库字符集的不正确设置、数据导入时的编码错误等。下面我们将详细讨论 MySQL 数据库乱码处理的方法。 1. 选择正确的...
通过以上步骤,可以有效地解决Node.js和C语言插入MySQL数据库时的乱码问题。重要的是要确保整个数据处理链路——从应用到数据库——保持一致的字符集设置,以确保数据的正确性。同时,对于新项目,推荐一开始就采用...
### MySQL数据库乱码问题解析与解决方案 #### 一、引言 在使用MySQL数据库的过程中,字符集设置不当可能会导致数据存储或查询时出现乱码问题。本文将针对MySQL数据库中的乱码现象进行深入分析,并提供相应的解决...
本篇文章将详细介绍如何解决MySQL数据库中的乱码问题,并探讨如何通过C#进行数据库操作的封装,提高代码的可重用性和效率。 首先,MySQL乱码问题的根源通常在于字符集设置。MySQL数据库、数据库表以及字段都有各自...
本文主要针对MySQL数据库的乱码问题提供详尽的解决方案,包括Web应用中的编码设置、数据库编码、开发工具的配置以及数据表中文字段的处理。 首先,Web应用中的中文问题涉及到JSP、HTML和Servlet的编码设置。在JSP...
本文将详细介绍如何解决在DELPHI中使用MyDAC连接MySQL数据库时出现的中文乱码问题。 #### 原因分析 中文乱码问题通常由以下几个方面的原因引起: 1. **客户端与服务器端编码不一致**:DELPHI客户端与MySQL服务器...
此外,我们还需要在数据库连接文件中指定字符集,以避免乱码问题。我们可以在数据库连接文件中加一句 set names ’gbk’ ;以指定字符集为 gbk。在网页显示时,也不会出现中文乱码。 解决 MySql 数据库导入中文乱码...
"国家开放大学 MySQL数据库应用实验训练1 在MySQL中创建数据库和表" 本实验训练旨在让学生掌握 MySQL 中的数据库和表的创建过程。 MySQL 是一种关系型数据库管理系统,广泛应用于各种领域。为提高学生的实践能力,...