1. 程式人生 > >MySQL字符集在Linux下與在Windows下的不同

MySQL字符集在Linux下與在Windows下的不同

今天在學習MySQL字符集知識的時候,發現在Linux作業系統下字符集的顯示與在Windows作業系統下不太一樣,此話怎麼講,請聽我細細道來,也就是說在Linux下建立的gbk和utf8型別的表,沒有顯式的指定字元型別直接插入中文後,預設是使用character_set_connection變數指定的型別的字元插入到表中(通常該變數的值建議設定為utf8,如果character_set_client變數與character_set_connection變數的值不同,字符集會發生轉換),在Windows下mysql客戶端需要設定成gbk字符集才可以正常顯示,而在Windows下沒有顯式的指定字元型別直接插入中文後,預設是使用gbk型別的字元插入到表中,而在Linux下設定成utf8才可以正常顯示。

請看下面的例項操作:
一、下面是在Linux作業系統所做的操作:
Linux作業系統環境:RHEL6.5 64bit
[
[email protected]
~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 (Santiago) MySQL環境:5.6.24 [[email protected] ~]# /home/hff/mysql5624/bin/mysqld --version /home/hff/mysql5624/bin/mysqld Ver 5.6.24 for Linux on x86_64 (Source distribution) [[email protected] ~]# /home/hff/mysql5624/bin/mysql --version /home/hff/mysql5624/bin/mysql Ver 14.14 Distrib 5.6.24, for Linux (x86_64) using EditLine wrapper [
[email protected]
mysql5624]# bin/mysql -S /home/hff/mysql5624/mysqld.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 5.6.24 Source distribution Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 檢視當前MySQL伺服器的字符集設定: mysql> show variables like 'character_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | +--------------------------+--------+ 7 rows in set (0.00 sec) mysql> use test; Database changed 建立t_gbk表,表字符集與列字符集都是gbk的: mysql> create table t_gbk(name varchar(20) charset gbk) charset gbk; Query OK, 0 rows affected (0.17 sec) 建立t_utf8表,表字符集與列字符集都是utf8的: mysql> create table t_utf8(name varchar(20) charset utf8) charset utf8; Query OK, 0 rows affected (0.21 sec) 向兩個表中插入中文記錄: mysql> insert into t_gbk values('1中文'); Query OK, 1 row affected (0.02 sec) mysql> insert into t_utf8 values('1中文'); Query OK, 1 row affected (0.02 sec) 查看錶資料,中文都可以正常顯示: mysql> select * from t_gbk; +--------+ | name | +--------+ | 1中文 | +--------+ 1 row in set (0.00 sec) mysql> select * from t_utf8; +--------+ | name | +--------+ | 1中文 | +--------+ 1 row in set (0.00 sec) 設定字符集相關變數為gbk: mysql> set names gbk; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'character_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | gbk | | character_set_connection | gbk | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | gbk | | character_set_server | utf8 | | character_set_system | utf8 | +--------------------------+--------+ 7 rows in set (0.00 sec) 然後顯示兩個表的中文資料,發現不能正常顯示了:按說t_gbk表的資料應該可以正常顯示啊,現在這裡不能正常顯示,所以我理解的是由於之前character_set_client和character_set_connection變數為utf8,導致插入到表中的中文字元都按照utf8的編碼格式進行的儲存,所以t_gbk也不能正常顯示中文 mysql> select * from t_gbk; +------+ | name | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> select * from t_utf8; +------+ | name | +------+ | 1 | +------+ 1 row in set (0.00 sec) 重新設定成utf8後可以正常顯示: mysql> set names utf8; Query OK, 0 rows affected (0.00 sec) mysql> select * from t_gbk; +--------+ | name | +--------+ | 1中文 | +--------+ 1 row in set (0.00 sec) mysql> select * from t_utf8; +--------+ | name | +--------+ | 1中文 | +--------+ 1 row in set (0.00 sec) 設定字符集相關變數為gbk: mysql> set names gbk; Query OK, 0 rows affected (0.00 sec) 向t_gbk插入資料成功: mysql> insert into t_gbk values('2中文'); Query OK, 1 row affected (0.02 sec) 然而,向t_utf8插入資料發現是失敗的:按說t_utf8表也是支援中文的,而現在不能正常插入,所以我理解的是由於character_set_client和character_set_connection設定為了gbk,導致插入到表中的中文字元都按照gbk的編碼格式進行的儲存,而t_utf8不能識別這種編碼格式,所以報錯 mysql> insert into t_utf8 values('2中文'); ERROR 1366 (HY000): Incorrect string value: '\xAD\xE6\x96\x87' for column 'name' at row 1 我們再來顯示一下表的值,發現在gbk下,“2中文”這條記錄正常顯示了,但是1記錄不正常: mysql> select name,length(name) from t_gbk; +---------+--------------+ | name | length(name) | +---------+--------------+ | 1 | 5 | | 2中文 | 7 | +---------+--------------+ 2 rows in set (0.00 sec) mysql> select name,length(name) from t_utf8; +-------+--------------+ | name | length(name) | +-------+--------------+ | 1 | 7 | +-------+--------------+ 1 row in set (0.00 sec) 二、下面是在Windows作業系統所做的操作: 在開啟一個mysql客戶端: 設定成gbk字符集(預設就是): mysql> set names gbk; Query OK, 0 rows affected (0.00 sec) 記錄正常顯示中文: mysql> select * from t_gbk; +---------+ | name | +---------+ | 1中文 | | 2中文 | +---------+ 3 rows in set (0.00 sec) mysql> select * from t_utf8; +-------+ | name | +-------+ | 1中文 | | 2中文 | +-------+ 2 rows in set (0.00 sec) 而設定成utf8字符集: mysql> set names utf8; Query OK, 0 rows affected (0.00 sec) 記錄中文不正常顯示: mysql> select * from t_gbk; +----------+ | name | +----------+ | 1涓?枃 | | 2涓?枃 | +----------+ 3 rows in set (0.00 sec) mysql> select * from t_utf8; +---------+ | name | +---------+ | 1涓?枃 | | 2涓?枃 | +---------+ 2 rows in set (0.00 sec) 結論:所以在Linux作業系統下,還是建議使用utf8這種字符集來支援中文,通用性強,如果使用gbk字符集型別的表,在windows下有可能不會正常顯示中文。

相關推薦

linuxwindows的換行符

回車符號和換行符號產生背景  關於“回車”(carriage return)和“換行”(line feed)這兩個概念的來歷和區別。在計算機還沒有出現之前,有一種叫做電傳打字機(Teletype Model 33)的玩意,每秒鐘可以打10個字元。但是它有一個問題,就是打完一

linux路徑分隔符'/'windows的分隔符'\',以及java項目,web項目讀取項目的路徑

oid ont resource light ros ren -i microsoft 配置文件 1, linux下的文件分隔符是‘/‘, windows下的文件分隔符為‘\‘。但是‘\‘這個符號是轉義符。如果需要在console輸出‘\‘這個符號的,你需要輸入‘\\‘。另

MySQL 解壓版在Windows的安裝配置

從 MySQL 官網下載解壓版本的安裝包 下載完成後解壓到安裝位置,我的安裝位置為 D:\database\mysql-5.7.24 在 D:\database\mysql-5.7.24 目錄下新

LinuxWindows的網路程式設計區別

轉載:https://www.cnblogs.com/gildoringlorin/p/3951317.html socket相關程式從Windows移植到Linux下需要注意的: 1)標頭檔案  Windows下winsock.h/winsock2.h  Linux下

LinuxWindowstxt檔案區別

  一、區別 換行符:     1.windows中的換行符是\r\n, 2. linux/unix下的換行符是\n。 其中: 回車符:\r=0x0d (13) return; #回車(carriage return) 換行符:\n=0x0a (10) newline。#換行(newline)       二

Linuxwindows長路徑名

BTRFS 255 bytes exFAT 255 UTF-16 characters ext2 255 bytes ext3 255 bytes ext3cow 255 bytes ext4 255 bytes FAT32 8.3 (255 UCS-2 code un

Qt源程式 在 linux windows 因原始檔編碼問題導致中文亂碼

當Qt編輯器使用系統編碼的預設設定時 在windows 下,源程式中如果不包含中文,原始檔使用的是ASCII編碼,否則是GBK編碼。在Linux下,源程式是是用UTF-8編碼的。對於原始檔中一個像“abc”這樣的C語言字串是不包含編碼型別資訊的,而Qt中QString是以

JAVADES加解密在linuxwindows的相容問題(從ITEYE搬家過來的)

        前段時間做了DES加密解密,採用的是javax下的DES演算法,在windows下寫的倒挺快,現在部署到linux上測試的時候,組長一臉嚴肅的找到我,聲色俱厲地問我為毛測試資料都不能解密了!你寫的什麼JB毛演算法!馬上就要測試了!你給我搞神馬!    天地良心,我測的很棒的,還拉出來那個小

LinuxWindows的效能監控

Linux -- uptime命令: top命令:可以知道每個程序佔CPU的情況 total 程序總數 running 正在執行的程序數 sleeping 睡眠的程序數 stopped 停止的程序數 zombie 殭屍程序數 Cpu(s): 0.1% us 使用者空間佔用C

MacWindowseclipse快捷鍵對照表

Cmd是command鍵,Opt是option鍵,Con是control。 內容輔助鍵:Option+/(Alt+/)   在當前行下加入空白行:Shift+Enter 在當前行上加入空白行:Shift+Enter+Cmd(Shift+Enter+Ctrl)

LinuxWindows遍歷目錄的方法及如何達成一致性操作

    最近因為測試目的需要遍歷一個目錄下面的所有檔案進行操作,主要是讀每個檔案的內容,只要知道檔名就OK了。在Java中直接用File類就可以搞定,因為Java中使用了組合模式,使得客戶端對單個檔案和資料夾的使用具有一致性,非常方便。但在C中就不一樣了,而且在不同的平臺下使用方法也不同。在Linux下實現該

連線遠端linux spark 配置windows pycharm開發環境

對不於不習慣在linux 操作的同學,往往想在windows 環境下編輯程式碼,然後利用遠端linux 伺服器的spark群集來提交任務,下面提供一個可行的方案 1 、設定環境變數 vim /etc/profile 新增: export PYTHONPA

PDB符號檔案Windows利用Windbg 分析dump

PDB簡介 跟蹤提供程式(例如應用程式或驅動程式)的程式資料庫 (PDB) 符號檔案包含用於對跟蹤訊息設定格式的指令,以便可以按照使用者可讀的形式顯示這些訊息。 跟蹤訊息格式設定指令屬於跟蹤提供程式原始碼的一部分。 WPP 前處理器從程式碼中提取這些指令並將其新增

命令列編譯C++(LinuxWindows

C++ 編譯過程   一般而言,對於 C++ 程式編譯有以下4個階段: 預處理(preprocessing) 對源程式中的偽指令(以#開頭的指令)和特殊符號進行處理。偽指令包括巨集定義、條件編譯指令、標頭檔案包含指令等。 編譯(compilation)

MacBook-快捷鍵-Windowshome等對應關係

1.Mac鍵盤與Windows對應關係: Mac鍵盤有很多按鍵和Windows按鍵是相同的,還有一些功能實現方法不同,詳細見下表對應關係: Windows Mac 說明 delete fn+delete 向後刪除 home c

Android中Button自定義外觀-按放開時不同背景

按下時一個背景圖片,鬆開按鍵時一個背景圖片。 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="htt

實現Ubuntu全屏Windows切換

怎麼實現Ubuntu全屏的情況下不用最小化虛擬機器也可以與Windows切換我的虛擬裝置是VMware,VirtualBox的操作不清楚。有一部分人是這樣的全屏之後是這樣看不到Windows下面的工作列你如果不像上面那樣設計的話,那麼如果你要切換到Windows上就要最小化U

windows轉向Linux(在Windows建立Deepin、Windows10雙系統)

顯示 linux系統 發行版 不錯 存儲 window www 容量 自動 我是19年3月轉向使用Linux進行開發,沒啥特別的理由,就是覺得使用Linux系統是每個程序員必須經歷的吧。 選擇版本 一開始,在網上了解到現在流行的Linux發行版有基於Redhat的,還有

Python3獲取WINDOWS所有常用系統路徑

all IT environ RM TE lena 常用 nvi form #codeing:utf-8import os #搞定WINDOWS下所有系統路徑filename=‘c:\\WINDOWS_ALL_PATH.txt‘f=open(filename,‘w‘)i=1

遊戲引擎選擇、MacWindowsUnrealEngine 4體驗對比

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!