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型別的字串