當前位置:首頁 » 操作系統 » 資料庫導出亂碼

資料庫導出亂碼

發布時間: 2022-09-23 02:11:51

Ⅰ mysql資料庫中存進的是中文,為什麼查出來的亂碼

一、轉碼失敗
在數據寫入到表的過程中轉碼失敗,資料庫端也沒有進行恰當的處理,導致存放在表裡的數據亂碼。
針對這種情況,前幾篇文章介紹過客戶端發送請求到服務端。
其中任意一個編碼不一致,都會導致表裡的數據存入不正確的編碼而產生亂碼。
比如下面簡單一條語句:
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~~

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:335
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:378
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:612
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:32
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:944
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:740
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:803
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:511
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:371