1、在修改數(shù)據(jù)庫編碼前先對數(shù)據(jù)庫備份(雖然utf8mb4兼容utf8,但有備無患)
站在用戶的角度思考問題,與客戶深入溝通,找到通化網(wǎng)站設(shè)計與通化網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋通化地區(qū)。
2、修改數(shù)據(jù)庫的編碼、表的編碼、列的編碼為utf8mb4
3、在Mysql數(shù)據(jù)庫配置文件(my.ini)中加入如下設(shè)置
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
重新啟動Mysql數(shù)據(jù)庫,確認(rèn)設(shè)置生效
mysql show VARIABLES like '%char%';
+--------------------------+----------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /home/app/mysql-5.5.33/share/charsets/ |
+--------------------------+----------------------------------------+
8 rows in set
4、在獲取數(shù)據(jù)庫連接的時候執(zhí)行sql:set names utf8mb4;我使用的是alibaba的開源數(shù)據(jù)庫連接池程序,在配置文件中增加一行如下配置
property name="connectionInitSqls" value="set names utf8mb4;" /
重新啟動應(yīng)用程序,問題解決
utf8編碼可以支持一到4字節(jié)的字符編碼,在mysql用我們一般使用utf8編碼來處理字符類型,通常情況下都沒有問題,但遇到4字節(jié)編碼的字符,在數(shù)據(jù)存取的時候就會有問題了。\x0d\x0a通常我們可能會得到一個錯誤或者警告:Incorrect string value: '/xF0/x9D/x8C/x86' for column ...\x0d\x0aMysql 從5.5.3版本開始支持4字節(jié)的utf8編碼,如果你的Mysql數(shù)據(jù)庫是5.5.3+,按照以下步驟就能解決這個問題,如果版本低于5.5.3,是不是可以考慮升級數(shù)據(jù)庫版本呢?\x0d\x0a1、在修改數(shù)據(jù)庫編碼前先對數(shù)據(jù)庫備份(雖然utf8mb4兼容utf8,但有備無患)\x0d\x0a2、修改數(shù)據(jù)庫的編碼、表的編碼、列的編碼為utf8mb4\x0d\x0a3、在Mysql數(shù)據(jù)庫配置文件(my.ini)中加入如下設(shè)置\x0d\x0a\x0d\x0a[client]default-character-set = utf8mb4[mysql]default-character-set = utf8mb4[mysqld]character-set-client-handshake = FALSEcharacter-set-server = utf8mb4collation-server = utf8mb4_unicode_ci\x0d\x0a\x0d\x0a重新啟動Mysql數(shù)據(jù)庫,確認(rèn)設(shè)置生效\x0d\x0a\x0d\x0amysql show VARIABLES like '%char%';+--------------------------+----------------------------------------+| Variable_name | Value |+--------------------------+----------------------------------------+| character_set_client | utf8 || character_set_connection | utf8 || character_set_database | utf8mb4 || character_set_filesystem | binary || character_set_results | utf8 || character_set_server | utf8mb4 || character_set_system | utf8 || character_sets_dir | /home/app/mysql-5.5.33/share/charsets/ |+--------------------------+----------------------------------------+8 rows in set\x0d\x0a\x0d\x0a4、在獲取數(shù)據(jù)庫連接的時候執(zhí)行sql:set names utf8mb4;我使用的是alibaba的開源數(shù)據(jù)庫連接池程序,在配置文件中增加一行如下配置\x0d\x0a\x0d\x0a\x0d\x0a\x0d\x0a重新啟動應(yīng)用程序,問題解決
1.選擇數(shù)據(jù)類型的基本原則 前提: 使用適合存儲引擎。
MyISAM數(shù)據(jù)表,最好使用固定長度的數(shù)據(jù)列代替可變長度的數(shù)據(jù)列。 2). MEMORY存儲引擎和數(shù)據(jù)列
MEMORY數(shù)據(jù)表目前都使用固定長度的數(shù)據(jù)行存儲,因此無論使用CHAR或VARCHAR列都沒有關(guān)系。兩者都是作為CHAR類型處理的。 3). InnoDB 存儲引擎和數(shù)據(jù)列 建議使用 VARCHAR類型,對于InnoDB數(shù)據(jù)表,內(nèi)部的行存儲格式?jīng)]有區(qū)分固定長度和可變長度列(所有數(shù)據(jù)行都使用指向數(shù)據(jù)列值的頭指針),因此在本質(zhì)上,使用固定長度的 CHAR列不一定比使用可變長度VARCHAR列簡單。因而,主要的性能因素是數(shù)據(jù)行使用的存儲總量。由于CHAR平均占用的空間多于VARCHAR,因 此使用VARCHAR來最小化需要處理的數(shù)據(jù)行的存儲總量和磁盤I/O是比較好的。 2. 固定長度數(shù)據(jù)列與可變長度的數(shù)據(jù)列1).char與varchar l CHAR和VARCHAR類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲或檢索過程中不進(jìn)行大小寫轉(zhuǎn)換。下面的表顯示了將各種字符串值保存到CHAR(4)和VARCHAR(4)列后的結(jié)果,說明了CHAR和VARCHAR之間的差別:值CHAR(4)存儲需求VARCHAR(4)存儲需求''' '4個字節(jié)''1個字節(jié)'ab''ab '4個字節(jié)'ab '3個字節(jié)'abcd''abcd'4個字節(jié)'abcd'5個字節(jié)'abcdefgh''abcd'4個字節(jié)'abcd'5個字節(jié) 請注意上表中最后一行的值只適用不使用嚴(yán)格模式時;如果MySQL運(yùn)行在嚴(yán)格模式,超過列長度不的值不保存,并且會出現(xiàn)錯誤。從CHAR(4)和VARCHAR(4)列檢索的值并不總是相同,因?yàn)闄z索時從CHAR列刪除了尾部的空格。通過下面的例子說明該差別: mysql CREATE TABLE vc (v VARCHAR(4), c CHAR(4)); Query OK, 0 rows affected (0.02 sec) mysql INSERT INTO vc VALUES ('ab ', 'ab '); Query OK, 1 row affected (0.00 sec) mysql SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc; +----------------+----------------+ | CONCAT(v, '+') | CONCAT(c, '+') | +----------------+----------------+ | ab + | ab+ | +----------------+----------------+ 1 row in set (0.00 sec)2). text和blob 在使用text和blob字段類型時要注意以下幾點(diǎn),以便更好的發(fā)揮數(shù)據(jù)庫的性能. (1). BLOB和TEXT值也會引起自己的一些問題,特別是執(zhí)行了大量的刪除或更新操作的時候。刪除這種值會在數(shù)據(jù)表中留下很大的"空洞",以后填入這些"空洞"的記錄可能長度不同,為了提高性能,建議定期使用 OPTIMIZE TABLE 功能對這類表進(jìn)行碎片整理. (2). 使用合成的(synthetic)索引。合成的索引列在某些時候是有用的。一種辦法是根據(jù)其它的列的內(nèi)容建立一個散列值,并把這個值存儲在單獨(dú)的數(shù)據(jù)列中。接下來你就可以通過檢索散列值找到數(shù)據(jù)行了。但是,我們要注意這種技術(shù)只能用于精確匹配的查詢(散列值對于類似或=等范圍搜索操作符 是沒有用處的)。我們可以使用MD5()函數(shù)生成散列值,也可以使用SHA1()或CRC32(),或者使用自己的應(yīng)用程序邏輯來計算散列值。請記住數(shù)值型散列值可以很高效率地存儲。同樣,如果散列算法生成的字符串帶有尾部空格,就不要把它們存儲在CHAR或VARCHAR列中,它們會受到尾部空格去除的影響。 合成的散列索引對于那些BLOB或TEXT數(shù)據(jù)列特別有用。用散列標(biāo)識符值查找的速度比搜索BLOB列本身的速度快很多。
當(dāng)前標(biāo)題:怎么在MySQL存取數(shù)據(jù) 如何從mysql中導(dǎo)出數(shù)據(jù)
瀏覽路徑:http://m.newbst.com/article12/hpddgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、域名注冊、品牌網(wǎng)站建設(shè)、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)