1、 編輯MySql的配置文件
在仙桃等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計制作、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計,全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站制作,仙桃網(wǎng)站建設(shè)費用合理。
MySql的配置文件Windows下一般在系統(tǒng)目錄下或者在MySql的安裝目錄下名字叫my.ini,可以搜索,Linux下一般是/etc/my.cnf
--在 [mysqld] 標簽下加上以下內(nèi)容:
default-character-set = utf8
character_set_server = utf8
注意:如果此標簽下已經(jīng)存在“default-character-set=GBK”類似的內(nèi)容,只需修改即可。
--在 [mysql] 標簽下加上一行
default-character-set = utf8
--在 [mysql.server]標簽下加上一行
default-character-set = utf8
--在 [mysqld_safe]標簽下加上一行
default-character-set = utf8
--在 [client]標簽下加上一行
default-character-set = utf8
2、 重新啟動MySql服務(wù)
Windows可在服務(wù)管理器中操作,也可使用命令行:
net stop mysql 回車
net start mysql 回車
服務(wù)名可能不一定為mysql,請按自己的設(shè)置
Linux下面可是用 service mysql restart
如果出現(xiàn)啟動失敗,請檢查配置文件有沒有設(shè)置錯誤
3、 查看設(shè)置結(jié)果
登錄MySql命令行客戶端:打開命令行
mysql –uroot –p 回車
輸入密碼
進入mysql后 執(zhí)行 :show variables like "% character %";
顯示結(jié)果應(yīng)該類似如下:
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
如果仍有編碼不是utf8的,請檢查配置文件,也可使用mysql命令設(shè)置:
set character_set_client = utf8;
set character_set_server = utf8;
set character_set_connection = utf8;
set character_set_database = utf8;
set character_set_results = utf8;
set collation_connection = utf8_general_ci;
set collation_database = utf8_general_ci;
set collation_server = utf8_general_ci;
另外:
建立數(shù)據(jù)庫時可以使用以下命令:
create database app_relation character set utf8;
use app_relation;
source app_relation.sql;
修改數(shù)據(jù)庫編碼的命令為:
alter database app_relation character set utf8;
import_table(importTable) 的延申功能:可定制化行輸入。
import_table(importTable) 我們之前有介紹過,是一款并行導(dǎo)入各種格式文本的工具,封裝了 MySQL 語句?load data local infile。
比如說要導(dǎo)入一個以 TAB 為分隔符的文本數(shù)據(jù)文件:/tmp/sample_ytt.txt?到表:ytt_new.t1,可以執(zhí)行下面語句:
上面結(jié)果是?load data infile?語句的導(dǎo)入結(jié)果。如果改用 import_table 方法來做同樣的事情,基于 Python 語法,使用方法如下:
那接下來看另外一個需求:在導(dǎo)入文本文件時對每行做預(yù)處理(例如在導(dǎo)入數(shù)據(jù)之前更改列 r2 的值為 mod(r1,10),列 r5 的值為 abs(r4-46) ),這樣可以減少導(dǎo)入后再次處理的時間開銷。
這個需求用?load data infile?語句非常容易實現(xiàn):(導(dǎo)入時更改列 r2 和 r5 的數(shù)據(jù),類似 UPDATE 語法)
那如果要用 util.import_table(importTable) 來實現(xiàn)上面的需求,在 MySQL 8.0.22 之前是沒辦法的。
隨著 MySQL 8.0.22 的發(fā)布,MySQL 對 import_table 方法做了些擴充功能,其中增加了一個選項 “decodeColumns” 可以實現(xiàn)字段的預(yù)先輸入定制化功能,并且還可以更加豐富。
接下來用 import_table 來實現(xiàn)上面的需求,定制化字段 r2 和 r5:
以上 Options 選項,見下圖:
我來具體解釋下上圖的含義:藍色字體 columns 對應(yīng)的數(shù)組分別指定數(shù)據(jù)文件中的每行字段,也就是默認的 TAB 分隔符所分割的每列值,1 和 2 代表占位符,1 代表數(shù)據(jù)文件中每行的第一個列,2 代表數(shù)據(jù)文件中每行的第四列,decodeColumns 字典分別對需要預(yù)先輸入的字段做處理。比如 r1 字段保留為變量 @1,r2 字段對應(yīng) mod(r1,10) 等。
如果還是不太理解變換規(guī)則,可以臨時打開 general log, 上面 import_table(importTable)對應(yīng)的 MySQL 日志為:
以上日志寫的很清楚,內(nèi)部轉(zhuǎn)換為最基本的load data infile語法。
那這里我簡單解讀了下 MySQL 8.0.22 對 MySQL Shell 的一項定制化輸入文本文件的新特性,更多的新特性可以繼續(xù)關(guān)注。
前言
上篇《VARCHAR(M) 到底占用多少個字節(jié)?|mysql系列(2)》分享了VARCHAR(M)?占用多少個字節(jié),那VARCHAR 最大能存多少個字符呢?以及了解這些對我們平時的開發(fā)工作中有什么幫助呢?那我們就要了解下存儲引擎中是怎么來處理數(shù)據(jù)的。這里我們還是以InnoDB 為例。
InnoDB數(shù)據(jù)記錄的結(jié)構(gòu)
在《執(zhí)行sql 語句時發(fā)生了什么?|mysql 系列(1)》一文中講到,MySQL服務(wù)器上負責對表中數(shù)據(jù)的讀取和落盤(即寫入磁盤)工作是由存儲引擎 完成的。InnoDB是一個將表中的數(shù)據(jù)存儲到磁盤上的存儲引擎 。這也是mysql 持久化的保證。插入的數(shù)據(jù)記錄在磁盤上的存放方式被稱為行格式或者記錄格式。Mysql 目前有4種行格式:Redundant、Compact、Dynamic、Compressed.
其中:
Redundant 目前貌似很少使用了。
可以用下面的語句來查看行格式。
我們以常用的Compact、Dynamic、Compressed 行格式為例。一條完整的記錄其實可以被分為 記錄的額外信息 和記錄的真實數(shù)據(jù)兩大部分?。Compact、Dynamic、Compressed行格式不同的地方在記錄的真實數(shù)據(jù)部分。我們尋求答案的地方在記錄的額外信息里面。
記錄的額外信息
記錄的額外信息包括:變長字段長度列表、NULL值列表和記錄頭信息。
變長字段長度列表: 比如VARCHAR(M)、VARBINARY(M)、各種TEXT類型,各種BLOB類型,把擁有這些數(shù)據(jù)類型的列稱為變長字段 ;
變長字段占用的存儲空間分為兩部分:
真實數(shù)據(jù)內(nèi)容是就是存的具體的值。那么對于占用的字節(jié)數(shù)該怎么表示呢?
如果列中的字符串都比較短,也就是說內(nèi)容占用的字節(jié)數(shù)比較小,用1個字節(jié)就可以表示,但是如果變長列的內(nèi)容占用的字節(jié)數(shù)比較多,可能就需要用2個字節(jié)來表示。具體用1個還是2個字節(jié)來表示真實數(shù)據(jù)占用的字節(jié)數(shù)。
對于VARCHAR(M)來說:
如果M×L?= 255,那么使用1個字節(jié)來表示真正字符串占用的字節(jié)數(shù)。
如果M×L? 255,則分為兩種情況:
所以,如果最多有2個字節(jié)來表示真正字符串占用的字節(jié)數(shù)的話。2個字節(jié)能表示最大的數(shù)為: 16個2進制位 也就是2的16次方= 65535 。如果VARCHAR(M)類型的列使用的不是ascii字符集,那M的最大取值取決于該字符集表示一個字符最多需要的字節(jié)數(shù)。
舉個例子:
以上就是今天的分享,歡迎拍磚!
Mysql的row_format
在mysql中, 若一張表里面不存在varchar、text以及其變形、blob以及其變形的字段的話,那么張這個表其實也叫靜態(tài)表,即該表的row_format是fixed,就是說每條記錄所占用的字節(jié)一樣。其優(yōu)點讀取快,缺點浪費額外一部分空間。
若一張表里面存在varchar、text以及其變形、blob以及其變形的字段的話,那么張這個表其實也叫動態(tài)表,即該表的row_format是dynamic,就是說每條記錄所占用的字節(jié)是動態(tài)的。其優(yōu)點節(jié)省空間,缺點增加讀取的時間開銷。
所以,做搜索查詢量大的表一般都以空間來換取時間,設(shè)計成靜態(tài)表。
row_format還有其他一些值:
DEFAULT
FIXED
DYNAMIC
COMPRESSED
REDUNDANT
COMPACT
修改行格式
ALTER TABLE table_name ROW_FORMAT = DEFAULT
修改過程導(dǎo)致:
fixed---dynamic: 這會導(dǎo)致CHAR變成VARCHAR
dynamic---fixed: 這會導(dǎo)致VARCHAR變成CHAR