資料庫導出亂碼
一、轉碼失敗
在數據寫入到表的過程中轉碼失敗,資料庫端也沒有進行恰當的處理,導致存放在表裡的數據亂碼。
針對這種情況,前幾篇文章介紹過客戶端發送請求到服務端。
其中任意一個編碼不一致,都會導致表裡的數據存入不正確的編碼而產生亂碼。
比如下面簡單一條語句:
set @a = "文本字元串";
insert into t1 values(@a);
變數 @a 的字元編碼是由參數 CHARACTER_SET_CLIENT 決定的,假設此時編碼為 A,也就是變數 @a 的編碼。
2. 寫入語句在發送到 MySQL 服務端之前的編碼由 CHARACTER_SET_CONNECTION 決定,假設此時編碼為 B。
3. 經過 MySQL 一系列詞法,語法解析等處理後,寫入到表 t1,表 t1 的編碼為 C。
那這里編碼 A、編碼 B、編碼 C 如果不兼容,寫入的數據就直接亂碼。
二、客戶端亂碼
表數據正常,但是客戶端展示後出現亂碼。
這一類場景,指的是從 MySQL 表裡拿數據出來返回到客戶端,MySQL 里的數據本身沒有問題。客戶端發送請求到 MySQL,表的編碼為 D,從 MySQL 拿到記錄結果傳輸到客戶端,此時記錄編碼為 E(CHARACTER_SET_RESULTS)。
那以上編碼 E 和 D 如果不兼容,檢索出來的數據就看起來亂碼了。但是由於數據本身沒有被破壞,所以換個兼容的編碼就可以獲取正確的結果。
這一類又分為以下三個不同的小類:
1)欄位編碼和表一致,客戶端是不同的編碼
比如下面例子, 表數據的編碼是 utf8mb4,而 SESSION 1 發起的連接編碼為 gbk。那由於編碼不兼容,檢索出來的數據肯定為亂碼。
2)表編碼和客戶端的編碼一致,但是記錄之間編碼存在不一致的情形
比如表編碼是 utf8mb4,應用端編碼也是 utf8mb4,但是表裡的數據可能一半編碼是 utf8mb4,另外一半是 gbk。那麼此時表的數據也是正常的,不過此時採用哪種編碼都讀不到所有完整的數據。這樣數據產生的原因很多,比如其中一種可能性就是表編碼多次變更而且每次變更不徹底導致(變更不徹底,我之前的篇章里有介紹)。舉個例子,表 t3 的編碼之前是 utf8mb4,現在是 gbk,而且兩次編碼期間都被寫入了正常的數據。
3)每個欄位的編碼不一致,導致亂碼和第二點一樣的場景。不同的是:非記錄間的編碼不統一,而是每個欄位編碼不統一。舉個例子,表 c1 欄位 a1,a2。a1 編碼 gbk,a2 編碼是 utf8mb4。那每個欄位單獨讀出來數據是完整的,但是所有欄位一起讀出來,數據總會有一部分亂碼。
三、LATIN1
還有一種情形就是以 LATIN1 的編碼存儲數據
估計大家都知道字元集 LATIN1,LATIN1 對所有字元都是單位元組流處理,遇到不能處理的位元組流,保持原樣,那麼在以上兩種存入和檢索的過程中都能保證數據一致,所以 MySQL 長期以來默認的編碼都是 LATIN1。這種情形,看起來也沒啥不對的點,數據也沒亂碼,那為什麼還有選用其他的編碼呢?原因就是對字元存儲的位元組數不一樣,比如 emoji 字元 "❤",如果用 utf8mb4 存儲,佔用 3 個位元組,那 varchar(12) 就能存放 12 個字元,但是換成 LATIN1,只能存 4 個字元。
Ⅱ 為什麼 資料庫提取中文是亂碼
從後台讀取數據時,通常會出現亂碼情況,比如「漢字」變成「?」等,造成這種情況的原因通常是編碼設置不對,解決方法如下:
第一種方法:在php中添加如下代碼,將編碼格式設為「utf-8」,代碼如下:
header("Content-Type: text/html; charset=UTF-8");
第二種方法:在php中添加另外一行代碼,同樣用來轉碼,代碼如下:
$conn = mysqli_connect($servername, $username, $password, $mysqlname);
$conn->query("SET NAMES utf8");
該種情況是先創建鏈接,之後再轉碼。
另外,在使用資料庫時,直接手動(非代碼)建表,通常會在表中輸入漢字時,瀏覽時無法顯示或顯示為「?」,造成這種情況的原因也是編碼問題,解決方案如下:
在建表或建庫時,表和庫的編碼格式一定要統一,設置成:「utf8_general_ci」,如下圖:
Ⅲ excel資料庫導出excel亂碼怎麼辦
excel資料庫導出excel亂碼怎麼辦
把資料庫的編碼改為utf-8,在新建表時,把表的默認編碼也改為utf-8,就可以了。
Ⅳ oracle數據導出spool方式,中文出現亂碼是什麼原因
一般來說,oracle數據導出spool方式,中文出現亂碼,這情況是因為資料庫伺服器和客戶端字元集不匹配,執行sqlplus的機器就是客戶端,伺服器和客戶端也可能是一台機器,執行sqlplus之前要先設置客戶端的字元集,在linux上:export NLS_LANG=.......
在windows上set NLS_LANG查詢資料庫字元集:select property_value from database_properties where property_name like 'NLS_CHAR%';
1、比如查詢結果是:ZHS16GBK
那你在sqlplus之前要設置:export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
然後再登錄sqlplus用spool生成數據
檢查下你導出時候的環境變數,導入時的環境變數
2、比如導出時NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
導入時NLS_LANG沒有設置,或者設置為其他字元集,則導入的庫內漢字就有可能變成亂碼。
解決方法,連接資料庫的時候設置正確字元集即可。
Ⅳ 為什麼我導出的數據是亂碼
首先要檢查資料庫裡面是否是亂碼,如果不是在看資料庫的編碼和你設置的編碼是否一致,不一致也會產生讀取時亂碼。 如果都沒問題用的是servlet應用的話可以寫個過濾器 亂碼問題一般都是這樣解決的
Ⅵ Oracle資料庫導出後漢字變成亂碼,有什麼辦法解決
檢查下你導出時候的環境變數,導入時的環境變數
比如
導出時NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
導入時NLS_LANG沒有設置,或者設置為其他字元集,則導入的庫內漢字就有可能變成亂碼。
解決方法,連接資料庫的時候設置正確字元集即可。
Ⅶ 請問,為啥PL/SQL 導出數據不全,導出界面亂碼
導出資料庫和導入資料庫的字元集不一樣。
查詢資料庫字元集語句:select userenv('language') from al;
如果資料庫已經安裝了發現字元集不一致可以對字元集進行修改,具體修改辦法
修改資料庫字元集方法
Ⅷ 從Mysql 裡面導出來的數據怎麼是亂碼
這是編碼不同造成的,要保證下面三處的編碼相同才行 以編碼為 Utf-8為例:
1.在創建網頁時 首選項裡面 要用 charset=utf-8;
2.在建表的時候設置編碼類型 整理編碼 為 utf-8;
3.以PHP為例 在資料庫連接語句處 要加一行mysql_query('SET NAMES "utf-8"') 進行數據格式化;
比如:
$db_host="localhost";
$db_user="root";
$db_password="password";
$db_name="test";
$link=mysql_connect($db_host,$db_user,$db_password);
mysql_query("SET NAMES 'utf-8'",$link); // 這句是 防亂碼 重點
$db=mysql_select_db($db_name,$link);
只要保證做到上面三條 就不會出現中文亂碼了 編碼也可以選其它的 只要三處編碼相同就行;
Good luck~~