1. 程式人生 > >mysql表的字符集uft8轉換成gbk測試

mysql表的字符集uft8轉換成gbk測試

一.測試需求
  將mysql 5.6下utf8字符集的表匯入到gbk字符集的庫中,測試是否成功,漢字是否顯示亂碼。

二.基本資訊
1.源表環境資訊:
(product)[email protected] [(none)]> select version();
+------------+
| version()  |
+------------+
| 5.6.29-log |
+------------+
1 row in set (0.00 sec)

(product)[email protected] [(none)]> \s
--------------
mysql  Ver 14.14 Distrib 5.6.29, for linux-glibc2.5 (x86_64) using  EditLine wrapper

Connection id:          1
Current database:
Current user:           [email protected]
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.6.29-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /tmp/mysql3376.sock
Uptime: 
mysql> show create table lots.t_order\G
*************************** 1. row ***************************
       Table: t_order
Create Table: CREATE TABLE `t_order` (
  `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  -----資訊保安,部分資訊省略------------------
  PRIMARY KEY (`ID`),
  KEY `index_to_order_no` (`TO_ORDER_NO`) USING BTREE,
  KEY `index_cust_order_no` (`CUSTOMER_ORDER_NO`) USING BTREE,
  KEY `index_contract_no` (`contract_no`) USING BTREE,
  KEY `index_express_no` (`EXPRESS_NO`) USING BTREE,
  KEY `index_express_code` (`EXPRESS_CODE`) USING BTREE,
  KEY `index_create_date` (`CREATE_DATE`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2360435 DEFAULT CHARSET=utf8 COMMENT='訂單表'
1 row in set (0.00 sec)

(product)[email protected] [lots]> select count(*) from t_order;
+----------+
| count(*) |
+----------+
|  1872178 |
+----------+
1 row in set (1.44 sec)


2.目標表環境資訊:
(product)[email protected] [(none)]> select version();
+------------+
| version()  |
+------------+
| 5.6.29-log |
+------------+
1 row in set (0.00 sec)

(product)[email protected] [(none)]> \s
--------------
mysql  Ver 14.14 Distrib 5.6.29, for linux-glibc2.5 (x86_64) using  EditLine wrapper

Connection id:          1
Current database:
Current user:           [email protected]
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.6.29-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    gbk
Db     characterset:    gbk
Client characterset:    gbk
Conn.  characterset:    gbk
UNIX socket:            /tmp/mysql3377.sock
Uptime:                 1 min 4 sec

三.匯出表
匯出資料庫lots下的表t_order:
[[email protected] data]$ mysqldump -uroot -p -S /tmp/mysql3376.sock lots t_order >t_order_utf8.sql
Enter password:
-rw-rw-r-- 1 mysql mysql 748147073 Apr 22 22:46 t_order_utf8.sql


四.將匯出sql檔案的字符集由utf8轉換成gbk

轉換成GBK:
[[email protected] ~]# cd /data/mysql/mysql3376/data
[[email protected] data]# which iconv
/usr/bin/iconv
[[email protected] data]$ iconv -t gbk -c t_order_utf8.sql >t_order_gbk.sql
[[email protected] data]$ ls -lrt
-rw-rw-r-- 1 mysql mysql 748147073 Apr 22 22:46 t_order_utf8.sql
-rw-rw-r-- 1 mysql mysql 640202710 Apr 22 22:54 t_order_gbk.sql
[[email protected] data]$
---比較原檔案和轉換成gbk後的檔案,發現轉換後的檔案變小,是因為編碼變了。

先在目標mysql中建立lots庫:create database lots;
然後再匯入表t_order到lots庫中:

[[email protected] data]$  mysql -uroot -p  --default-character-set=gbk -S /tmp/mysql3377.sock lots <t_order_gbk.sql
Enter password:
ERROR 1064 (42000) at line 467: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

'???','??????','??????','','2345678','2015-10-30 17:10:06','1','2015-11-04' at line 1

上面報錯在是sql檔案的第467行,檢視該行內容:
[[email protected] data]$ tail -n +467 t_order_gbk.sql|head -1
內容是顯示亂碼的insert 語句:
----內容長,省略----
00708','bv15103001742614','41038','HTKY','50185888807019','??3','??′??','??-?6?????????o?,'??-?','6??','???','','1328900','2015-10-30 17:10:09','1','2015-11-02

11:16:22','1','2015-10-30 18:58:00','B2C','','5','1','2015-10-30 19:13:47','0'),(1547864,'4775','?2?熸??1??','?a???àμ牌Сμ粖','JDDD23456-20151030-

00731','BC15103001742619','26','EMS','234456000','??3','лУ÷','?£?¨????У?????????μ???1,'?£?¨?','???','У??','','15678902','2015-10-30 17:10:09','1','2015-11-01

13:59:00','1','2015-10-30 18:22:00','B2C','','5','1','2015-10-30 18:59:03','0');

-----記錄數與源表相差很大
(product)[email protected] [lots]> select count(*) from t_order;
+----------+
| count(*) |
+----------+
|  1058930 |
+----------+
1 row in set (0.96 sec)

-----所有漢字匯入後被截斷,而資料丟失
(product)[email protected] [lots]> select * from t_order limit 1,2\G
*************************** 1. row ***************************
               ID: 2
      CUSTOMER_ID: 4775
    CUSTOMER_NAME:
   WAREHOUSE_NAME:
CUSTOMER_ORDER_NO: J2015MD-20140901-00076
 TO_ORDER_NO: AD15333333333
     EXPRESS_CODE: 490733
     EXPRESS_NAME: YTO
       EXPRESS_NO: 3456789
       ORDER_TYPE:
     ORDER_SOURCE:
     SHIP_TO_NAME:
   SHIP_TO_ADRESS:
 SHIP_TO_PROVINCE:
     SHIP_TO_CITY:
     SHIP_TO_AREA:
  SHIP_TO_MOBILE1:
  SHIP_TO_MOBILE2: 1345678456
      CREATE_DATE: 2015-10-19 21:03:40
          IS_SIGN: 1
        SIGN_DATE: 2015-09-02 14:39:56
      is_delivery: 1
    delivery_date: 2015-09-01 11:50:20
    business_type: B2C
      contract_no: NULL
           edi_id: NULL
           is_got: 0
         got_date: NULL
           is_end: 0

五.峰迴路轉

仔細檢查前面步驟,發現有兩個地方可以稍作修改後,再匯入測試:

1.在目標庫建庫時,指定DEFAULT CHARSET=gbk引數
先drop database lots;
再執行:create database lots DEFAULT CHARSET=gbk;
顯示如下:

(product)[email protected] [lots]> show create database lots\G
*************************** 1. row ***************************
       Database: lots
Create Database: CREATE DATABASE `lots` /*!40100 DEFAULT CHARACTER SET gbk */
1 row in set (0.00 sec)


2.將用iconv命令轉碼匯出檔案中的utf8改成gbk
vi t_order_gbk.sql
查詢所有utf8關鍵字,並用gbk替換後儲存。


再匯入到目標環境:
[[email protected] data]$ mysql -uroot -p  --default-character-set=gbk -S /tmp/mysql3377.sock lots <t_order_gbk.sql
Enter password:

匯入成功,並沒有報錯。

檢查表的記錄數與源表相同:
(product)[email protected] [lots]> select count(*) from t_order;
+----------+
| count(*) |
+----------+
|  1872178 |
+----------+
1 row in set (2.68 sec)

檢查表的內容,漢字顯示正常:
(product)[email protected] [lots]> select * from t_order limit 1,2\G
*************************** 1. row ***************************
               ID: 2
      CUSTOMER_ID: 4775
    CUSTOMER_NAME: 南昌市xxxx有限公司
   WAREHOUSE_NAME: 廣東xx倉
CUSTOMER_ORDER_NO: JxcvbS2015MD-20150901-00076
 TO_ORDER_NO: cvb15090100d940895
     EXPRESS_CODE: 49345
     EXPRESS_NAME: RFD
       EXPRESS_NO: 23456678
       ORDER_TYPE: 銷售出庫
     ORDER_SOURCE:


---轉換後目標表的最長三個漢字欄位的最大長度
(product)[email protected] [lots]> select max(length(CUSTOMER_NAME)),max(char_length(CUSTOMER_NAME)),max(length(WAREHOUSE_NAME)),max(char_length(WAREHOUSE_NAME)),max

(length(SHIP_TO_ADRESS)),max(char_length(SHIP_TO_ADRESS))from t_order\G
*************************** 1. row ***************************
      max(length(CUSTOMER_NAME)): 42
 max(char_length(CUSTOMER_NAME)): 22 -----字元個數,漢字也是一個字元
     max(length(WAREHOUSE_NAME)): 34
max(char_length(WAREHOUSE_NAME)): 18 -----字元個數,漢字也是一個字元
     max(length(SHIP_TO_ADRESS)): 199
max(char_length(SHIP_TO_ADRESS)): 138 -----字元個數,漢字也是一個字元
1 row in set (10.24 sec)


---轉換前源表最長三個漢字欄位的最大長度
(product)[email protected] [lots]> select max(length(CUSTOMER_NAME)),max(char_length(CUSTOMER_NAME)),max(length(WAREHOUSE_NAME)),max(char_length(WAREHOUSE_NAME)),max
(length(SHIP_TO_ADRESS)),max(char_length(SHIP_TO_ADRESS))from t_order\G
*************************** 1. row ***************************
      max(length(CUSTOMER_NAME)): 63
 max(char_length(CUSTOMER_NAME)): 22 -----字元個數,漢字也是一個字元
     max(length(WAREHOUSE_NAME)): 50
max(char_length(WAREHOUSE_NAME)): 18 -----字元個數,漢字也是一個字元
     max(length(SHIP_TO_ADRESS)): 291
max(char_length(SHIP_TO_ADRESS)): 138 -----字元個數,漢字也是一個字元
1 row in set (14.27 sec)

查詢三個漢字最大長度欄位返回的記錄數和內容,檢查是否相同?

select CUSTOMER_NAME from (select CUSTOMER_NAME,max(char_length(CUSTOMER_NAME)) as maxlength from t_order group by CUSTOMER_NAME) tmp where tmp.maxlength=22;
返1行記錄數,且漢字顯示正常,轉換前後內容相同,內容忽略

select WAREHOUSE_NAME from (select WAREHOUSE_NAME,max(char_length(WAREHOUSE_NAME)) as maxlength from t_order group by WAREHOUSE_NAME) tmp where tmp.maxlength=18;
返1行記錄數,且漢字顯示正常,轉換前後內容相同,內容忽略。

select SHIP_TO_ADRESS from (select SHIP_TO_ADRESS,max(char_length(SHIP_TO_ADRESS)) as maxlength from t_order group by SHIP_TO_ADRESS) tmp where tmp.maxlength=138;
返2行記錄數,且漢字顯示正常,轉換前後內容相同,內容忽略。


總結:
  在某些情況下,可以將utf8的表正常轉換成gbk,且所有漢字顯示正常。若生產環境需要進行轉碼,需要經過充分和嚴格測試驗證,確認資料是否有丟失等問題。

相關推薦

mysql字符集uft8轉換gbk測試

一.測試需求   將mysql 5.6下utf8字符集的表匯入到gbk字符集的庫中,測試是否成功,漢字是否顯示亂碼。 二.基本資訊 1.源表環境資訊: (product)[email protected] [(none)]> select version()

python入門:UTF-8轉換GBK編碼

終端 nco 什麽 等於 windows 就是 python 2 類型 window 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #UTF-8轉換成GBK編碼 4 #temp(臨時雇員,譯音:泰坡) 5

編碼encode,表現形式是轉換 bytes,實際轉換gbk或者utf-8

# s = 'alex'# s1 = b'alex'# print(s,type(s))# print(s1,type(s1)) # s = '中國'# print(s,type(s))# s1 = b'中國'# print(s1,type(s1)) s1 = 'alex'# encode 編碼,如何將s

mysql將timestamp型別轉換date型別資料

語法格式如下:date_format(timestamp,'%Y-%m-%d %T') DATE_FORMAT() 函式用於以不同的格式顯示日期/時間資料。 DATE_FORMAT(date,format) :date 引數是合法的日期,format 規定日期/時間的輸出

將二叉查找樹轉換雙鏈

val temp node return 一個 給定 雙向 order write 將一個二叉查找樹按照中序遍歷轉換成雙向鏈表樣例 給定一個二叉查找樹: 4 / \ 2 5 / \1 3返回 1<->2<->3<->

mysql 拉丁1 轉換 utf8

mysql本例子環境為centos 7.4 yum安裝 mariadb 5.5.56環境準備:創建latin1編碼的庫,表,數據mysql --default-character-set=latin1show variables like ‘char%‘;create database latin;show

記一個mysql環境RR隔離級別轉換RC的問題

mysql 事務隔離級別 RR RC先了解RR(REPEATABLE-READ)和RC(READ-COMMITTED)的區別.RR隔離級別增加了間隙鎖,避免了幻讀,並且阻止了不可重復讀,讓同一個事務裏面的查詢和修改都是一致的.mysql默認的隔離級別就是RR.雖然說RC隔離級別在同一個事務內會存在查詢出不同數

https,https的本地測試環境搭建,asp.net結合https的代碼實現,http網站轉換https網站之後遇到的問題

基本 解密 req with 網址 orm forms 訪問 art 一:什麽是https SSL(Security Socket Layer)全稱是加密套接字協議層,它位於HTTP協議層和TCP協議層之間,用於建立用戶與服務器之間的加密通信,確保所傳遞信息的安全性

二叉樹轉換雙向鏈

遞歸 out bsp root 進入 return 方式 sub AD 前言   二叉樹我們都是知道,一個節點有兩個子節點,分別為左右子節點,樹形結構則分叉左右子樹。如何把二叉樹轉換成雙向鏈表,方式方法有許多,這裏主要介紹一種方法,直接在二叉樹本身的左右鏈上做文章,采用遞歸

(轉)為什麽HashMap中鏈長度超過8會轉換紅黑樹

假設 n) net hashmap 頻繁 發生 等於 pan tails 原博地址:https://blog.csdn.net/xingfei_work/article/details/79637878 HashMap在jdk1.8之後引入了紅黑樹的概念,表示若桶中鏈表

自定義jquery的方法,將Form單中的內容轉換json

// 自定義jquery的方法,將Form表單中的內容轉換成json $.fn.serializeJson=function(){ var serializeObj={}; var array=this

如何將PDF轉換Excel表格

PDF表單 PDF表單可以分為兩種型別:靜態PDF表單和互動式PDF表單。靜態PDF表單是沒有互動元素的傳統PDF文件,它帶有空白橫線和文字框,但我們無法直接點選進行填寫。另一種PDF表單是互動式PDF表單,用於閱讀PDF的使用者與PDF所有者或PDF版權擁有者之間進行互動交流。 表單應用 在我

mysql資料庫字符集的修改以及字符集的修改,以及將*.sql檔案匯入資料庫

一、我們需要將預設的字符集更改為utf-8來解決資料庫匯入資料的亂碼問題。 我們需要先檢視資料庫預設的字符集是什麼: show variables like 'character_set_%' 檢視所有的預設字符集 mysql> show variables like 'cha

form轉換json({key:value, key:value})

1 jqery中的方法 ``` // 自定義jquery的方法,將Form表單中的內容轉換成json $.fn.serializeJson=function(){ var serializeObj={}; var array=this.s

將oracle的dmp資料庫檔案轉換mysql的sql檔案

一、前提及準備: 1、dmp檔案是無法直接轉換為.sql檔案的,所以首先把dmp檔案匯入Oracle資料庫中,然後重新匯出格式為.sql檔案格式,在此先省略匯出步驟,注意此時匯出的.sql檔案為資料庫的表結構,並沒有資料 2、下載安裝PowerDesigner工具 我的百度雲連結:h

python在gbk編碼轉換utf-8時亂碼問題

例項網站:http://www.ip138.com/ips138.asp?ip=124.24.13.241&action=4 #專案爬蟲,環境python-下載匯入requests、lxml包 #url時是查ip位置的介面 url_1='http://www.ip1

java.util.Date日期類通過java語句轉換Sql(這裡測試用的是oracle)語句可直接插入(如:insert into)的日期型別

public void add(Emp emp) throws Exception{ QueryRunner runner = new QueryRunner(JdbcUtil.getDataSource()); String sql = "insert

如何將mysql結構匯出Excel格式的(並帶備註)

方法一: 1.使用一個MySQL管理工具:SQLyog,點選選單欄“資料庫”下拉的最後一項: 匯出的格式如下: 2.要想轉成Excel格式的只需手動將該表複製到Excel中去。 方法二: 1.以下用的是Navicat Premium,可以換成

將Excel中的資料 轉換XML 並對XML資料進行讀取

EXCEL 轉換成 XML 工具類 using System; using System.Collections.Generic; using System.Data; using System.Data.OleDb; using System.Xml; usi

mysql中int型的數字怎麼轉換字串 以及字串轉換int

MySQL 數字型別轉換函式(concat/cast)。 1、將Int 轉為varchar經常用 concat函式,比如concat(8,’0′) 得到字串 ’80′。 2、將varchar 轉為Int 用 cast(a as signed) a為varchar型別的字串