數據庫中關於字符集的種類有很多,對編程有影響的主要是客戶端字符集和數據庫字符集(還有一個服務器字符集,不知道幹什麼用的)。
數據庫中常用的操作就是保存數據和讀取數據,在這過程中,亂不亂碼和數據庫字符集貌似沒有什麼關係。我們只要保證寫入時選擇的字符集和讀取時選擇的字符集一致,即只需保證兩次操作的客戶端字符集一致即可。
客戶端字符集的設置,依據客戶端不同方法不同:
1. 使用控制檯連接,在my.ini文件中的client項裏面設置;
2. 使用ems連接,優先使用ems連接配置的字符集,默認使用my.ini文件中的設置;
3. jdbc連接,在連接串中指定:
jdbc:mysql://192.168.3.99:3306/test?useUnicode=true& ;characterEncoding=gbk
在寫入時Mysq會將客戶端指定的字符集轉換成數據庫字符集存入數據文件,讀取時又將數據庫字符集轉換成客戶端指定的字符集展示給客戶端,把客戶端字符集和數據庫字符設置一致,顯而易見的好處是免掉轉換的性能損耗;另外,如果考慮到以後數據庫的遷移,將數據庫字符集設置爲大多數數據庫都支持的字符集會省掉很大麻煩。
幾個字符集相關的命令:
1. 查看 MySQL 數據庫服務器字符集,數據庫字符集和客戶端字符集
show variables like '%char%';
character_set_client,客戶端字符集
character_set_database,數據庫字符集
character_set_server,服務器字符集
2. 查看 MySQL 數據表(table) 的字符集
show table status from tablename like '%countries%';
3. 查看 MySQL 數據列(column)的字符集。
show full columns from tablename;
4. 查看當前安裝的 MySQL 所支持的字符集。
show char set;
-
資料引用:http://www.knowsky.com/440280.html
修改數據庫,數據表,表中字段的編碼(解決jsp亂碼)
要解決JSP亂碼,首先就要了解JSP亂碼的原因
1.架設服務器安裝MYSQL時的會讓你選擇一種編碼,如果這種編碼與你的網頁不一致,可能就會造成JSP頁面亂碼
2.在PHPMYADMIN或mysql-front等系統 創建數據庫時會讓你選擇一種編碼,如果這種編碼與你的網頁不一致,也有可能造成JSP頁面亂碼
3.創建表時會讓你選擇一種編碼,如果這種編碼與你的網頁編碼不一致,也可能造成JSP頁面亂碼
4.創建表時添加字段是可以選擇編碼的,如果這種編碼與你的網頁編碼不一致,也可能造成JSP頁面亂碼
5.用戶提交JSP頁面的編碼與顯示數據的JSP頁面編碼不一致,就肯定會造成JSP頁面亂碼.
如用戶輸入資料的JSP頁面是big5碼, 顯示用戶輸入的JSP頁面卻是gb2312,這種100%會造成JSP頁面亂碼
6.字符集不正確
要注意:
1.平時你在某些網站看到的文字可能有幾種編碼, 如你看到一個繁體字,它有可能是big5編碼,也有 可能是utf-8編碼的,更有可能是gb碼的,沒錯,也就是說有簡體編碼的繁體字,也有繁體編碼的簡體字,一定要了解這一點.
如果你是做一個簡體編碼的網頁,編碼定爲GB2312,如果有香港和臺灣地區的訪客提交繁體的信息,就可能會造成亂碼,解決方法就是(1)將網站編碼設爲utf-8,這樣可以兼容世界上所有字符, (2)如果網站已經運作了好久,已有很多舊數據,不能再更改簡體中文的設定,那麼建議將頁面的編碼設爲GBK,
GBK與GB2312的區別就在於:GBK能比GB2312顯示更多的字符,要顯示簡體碼的繁體字,就只能用GBK
7.JSP連接MYSQL數據庫語句指定的編碼不正確
8.JSP頁面沒有指定數據提交的編碼,就會造成亂碼:
所以,JSP亂碼的原因無非就是以上幾種,知道原因之後,要解決JSP亂碼的方法也容易多了
我們一一來表達:
1.如果安裝mysql的編碼已不能更改,很多朋友是購買虛擬主機建立網站,無權更改MYSQL的安裝編碼,這一關我們可以跳過,因爲只要後面的步聚正確,一樣能解決亂碼問題
2.修改數據庫編碼,如果是數據庫編碼不正確: 可以在phpmyadmin 執行如下命令: ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是將test數據庫的編碼設爲utf8
3.修改表的編碼:ALTER TABLE `category` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是將一個表category的編碼改爲utf8
4.修改字段的編碼:
ALTER TABLE `test` CHANGE `dd` `dd` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
以上命令就是將test表中 dd的字段編碼改爲utf8
5.如果是這種情況容易解決,只需檢查下頁面,修改源文件的charset即可
, //這個正確就無問題了
6.這種情況也是修改頁面charset即可,
7.在JSP連接數據庫的語句中,
private String url="jdbc:mysql://localhost/"+DB_NAME+" user="+LOGIN_NAME+"&password="+LOGIN_PASSWORD+"&characterEncoding=GBK"; //相鍵要看characterEncoding
8.這種亂碼的情況,只需在頁面開頭加上request.setCharacterEncoding("GBK"); 指定提交的即可
注意:按照以上方法修改以後只能保證你新插入的數據不會亂碼,舉個例:如果你用戶已提交的數據是BIG5,你卻想通過以上方法改爲可以在GB2312的網頁正確顯示是不可能的, 這種文字內碼的變換隻能通過另寫程序來解決,請WEB745.com其它相關文章
總結:先要判斷JSP亂碼是插入數據庫之後亂碼,還是JSP頁面剛提交過來就亂碼了,如果JSP剛接收上一頁面的數據顯示就亂碼了,肯定是字符集不對,可者沒有加request.setCharacterEncoding("GBK");
如果是數據庫的原因就參考上面的2,3,4種方法
可能是編碼問題
這樣連接一下數據庫看看
jdbc:mysql://localhost:3306/xxxx useUnicode=true&characterEncoding=UTF-8
看看能否有效果
-
資料引用:http://www.knowsky.com/344632.html
jsp插入mysql中出現亂碼的解決辦法
jsp 頁面用下面3句語句來保證是gbk 編碼
<%@ page session="true" %>
<%@ page contentType="text/html;charset=gbk" %>
<%@page pageEncoding="gbk"%>
<%request.setCharacterEncoding("gbk");%>
數據庫連接用如下語句
String sConnStr ="jdbc:mysql://localhost:3306/test?user=michael&password=123456&useUnicode=true&characterEncoding=gbk" ;
並且在mysql的my.ini的內容如下
basedir=D:/mysql
#bind-address=127.0.0.1
datadir=D:/mysql-data/data
default_character_set=gbk
#language=D:/mysql/share/your language directory
#slow query log#=
#tmpdir#=
#port=3306
#set-variable=key_buffer=16M
[WinMySQLadmin]
Server=D:/mysql/bin/mysqld-nt.exe
user=michael
password=123
[client]
default_character_set=gbk
讀jsp頁面之間傳遞的參數在頁面顯示正常
在dos命令行下插入數據後,顯示也正常
其中一條插入語句如下:
<jsp:useBean id="reg" scope="page" class="test.chatreg" />
String strSQL="insert into chatreg(username , password , email ,homepage )
values('" + regName + "', '" + regPassword +"' , '" + regEmail + "' , '" + regHomepage + "') ";
reg.executeQuery(strSQL);
-
資料引用:http://www.knowsky.com/344631.html
mysql中寫中文亂碼的解決
我插入Mysql5的中文一直是亂碼。
但是直接使用mysqlAdmin,EMS等工具插入DB就不是亂碼。而且我還可以使用程序正常地讀出來。
原因是:
DBDriverClass=com.mysql.jdbc.Driver
DBURL=jdbc:mysql://10.4.2.52:3306/srx?useUnicode=true&characterEncoding=utf-8
這樣的URL中useUnicode=true和characterEncoding=utf-8兩個屬性都不好用。
所以,數據庫服務器無法從URL中獲知Client使用了哪個編碼。於是就使用數據庫服務器上默認的latin也就是iso-8859-1編碼來解析用戶發送的sql語句。這樣,原本用戶是用操作系統的編碼,但是服務器硬給轉成ISO-8859-1,所以就亂碼了。
Client端只要配置好
useUnicode=true
characterEncoding=utf-8
這兩個屬性。只要指定了,就不會亂碼。utf-8可以,gb2312可以,gbk可以。指定了什麼,Client就默認以這種
編碼轉換SQL語句,服務器也就知道怎麼轉會去。
怎麼看客戶端發送給服務器的SQL使用什麼編碼呢?
在客戶端寫個程序,執行SQL語句:
public void select() throws SQLException {
ResultSet rs = this.cnn.createStatement().executeQuery("SHOW VARIABLES LIKE 'character_set_%'");
while(rs.next()){
System.out.println(rs.getString(1)+","+rs.getString(2));
}
rs.close();
}
沒有配置characterEncoding=utf-8之前,我使用的是DBURL=jdbc:mysql://10.4.2.52:3306/srx?useUnicode=true&characterEncoding=utf-8 這樣的配置。結果用select()方法查詢結果如下:
character_set_client,latin1
character_set_connection,latin1
character_set_database,utf8
character_set_filesystem,binary
character_set_results,
character_set_server,latin1
character_set_system,utf8
character_sets_dir,/usr/local/mysql-standard-5.0.27-linux-i686/share/mysql/charsets/
注意第一行就可以了,可見使用的是latin1。
而latin1本身就無法表示漢字,經過這個編碼打包的SQL語句發給Server,Server也用Latin1解析也無法還原。
所以,我總是寫亂碼到DB。
而配置了配置characterEncoding=utf-8之後,
執行select(),結果:
character_set_client,utf8
character_set_connection,utf8
character_set_database,utf8
character_set_filesystem,binary
character_set_results,
character_set_server,latin1
character_set_system,utf8
character_sets_dir,/usr/local/mysql-standard-5.0.27-linux-i686/share/mysql/charsets/
第一行爲utf-8,SQL將用UTF8打包給Server,Server也用Client配置的UTF8
解析。
-
資料引用:http://www.knowsky.com/344304.html