1)不是應該用相同的編碼才不會亂碼的嗎?
另外,資料庫的編碼是latin1不是不支援中文的嗎?為什麼我這裡能顯示中文?
2)還有一點不理解的是:我用set names utf8後,中文會亂碼;
用set names gbk 後,中文能正常顯示了,還是不太理解,為什麼utf8不能顯示中文?
3)我設定了set names gbk後,中文顯示沒有問題了。但關閉用戶端再開啟的時候,又必須再來一次set names gbk才能顯示中文,怎麼解決這個問題。
回複內容:
1)不是應該用相同的編碼才不會亂碼的嗎?
另外,資料庫的編碼是latin1不是不支援中文的嗎?為什麼我這裡能顯示中文?
2)還有一點不理解的是:我用set names utf8後,中文會亂碼;
用set names gbk 後,中文能正常顯示了,還是不太理解,為什麼utf8不能顯示中文?
3)我設定了set names gbk後,中文顯示沒有問題了。但關閉用戶端再開啟的時候,又必須再來一次set names gbk才能顯示中文,怎麼解決這個問題。
1、MySQL 的字元集支援有兩個方面:字元集(Character set)和排序方式(Collation)。對於字元集的支援細化到四個層次: 伺服器(server),資料庫(database),資料表(table)和串連(connection)。
2、Db characterset: 你對這個理解好像有些偏差,這個是指當前資料庫預設字元集, 請看下面例子。
CREATE DATABASE `db_test1` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';use db_test1;status;Server characterset: utf8Db characterset: utf8Client characterset: utf8Conn. characterset: utf8----------------------------------------CREATE DATABASE `db_test2` CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci';use db_test2;status;Server characterset: utf8Db characterset: latin1Client characterset: utf8Conn. characterset: utf8
3、Server characterset 是指你建立資料庫時如果不指定字元集時候使用的預設字元集。
4、Client characterset 是用戶端串連到mysql所用的字元集,也就是說是使用這種字元集和資料庫進行互動的。資料庫最終儲存的二進位,也就是說按照這個編碼把當前輸入的字元進行編碼成對應的二進位。可以在登入mysql指定。
mysql -uroot -p --default-character-set=latin1或set names latin1
現在已經指定字元集有好幾種,伺服器、用戶端、資料庫已經表等。 所以對於“對應編碼相同就不會亂碼”就需要重新理解一下,我的理解是:當用戶端和資料庫表所用的字元集一致就不會亂碼。注意:伺服器字元集可以使用utf-8、資料庫字元集可以用GBK,而最終的表也可以為utf8。
CREATE DATABASE `db_test1` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';use db_test1;show create database db_test1;+----------+-------------------------------------------------------------------+| Database | Create Database |+----------+-------------------------------------------------------------------+| db_test1 | CREATE DATABASE `db_test1` /*!40100 DEFAULT CHARACTER SET utf8 */ |+----------+-------------------------------------------------------------------+create table test(name varchar(20)) default charset = latin1; show create table test;+-------+------------------------------------------------------------------------------------------------+| Table | Create Table |+-------+------------------------------------------------------------------------------------------------+| test | CREATE TABLE `test` ( `name` varchar(20) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1 |+-------+------------------------------------------------------------------------------------------------+退出後重新連mysqlmysql db_test1 --default-character-set=latin1statusConnection id: 299Current database: db_test1Current user: root@localhostSSL: Not in useCurrent pager: stdoutUsing outfile: ''Using delimiter: ;Server version: 5.6.23 MySQL Community Server (GPL)Protocol version: 10Connection: Localhost via UNIX socketServer characterset: utf8Db characterset: utf8Client characterset: latin1Conn. characterset: latin1insert into test values('中文測試');select * from test;+--------------+| name |+--------------+| 中文測試 |+--------------+可以看到這裡沒有看到亂碼。當使用命令set names 修改用戶端字元集的情況mysql> set names utf8;Query OK, 0 rows affected (0.00 sec)mysql> select * from test;+------------------------------+| name |+------------------------------+| 䏿–‡æµ‹è¯• |+------------------------------+1 row in set (0.00 sec)mysql> set names gbk;Query OK, 0 rows affected (0.00 sec)mysql> select * from test;+----------------+| name |+----------------+| ???????? |+----------------+1 row in set (0.00 sec)
因為 windows 下的 cmd 不支援 utf8 編碼,所以使用 utf8 編碼會亂碼。
因為是在windows下,所以set names gbk顯示正常
Server characterset: utf8Db characterset: utf8Client characterset: utf8Conn. characterset: utf8
這樣就不用每次set names gbk