精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

10分鐘學會理解和解決MySQL亂碼問題

數據庫 MySQL 數據庫運維
本文將詳細介紹MySQL亂碼的成因和具體的解決方案。在閱讀本文之前,強烈建議對字符集編碼概念還比較模糊的同學 閱讀下博主之前對相關概念的一篇科普:十分鐘搞清字符集和字符編碼

本文將詳細介紹MySQL亂碼的成因和具體的解決方案

在閱讀本文之前,強烈建議對字符集編碼概念還比較模糊的同學 閱讀下博主之前對相關概念的一篇科普:十分鐘搞清字符集和字符編碼

MySQL出現亂碼的原因

要了解為什么會出現亂碼,我們就先要理解:從客戶端發起請求,到MySQL存儲數據,再到下次從表取回客戶端的過程中,哪些環節會有編碼/解碼的行為。為了更好的解釋這個過程,博主制作了兩張流程圖,分別對應存入和取出兩個階段。

存入MySQL經歷的編碼轉換過程

上圖中有3次編碼/解碼的過程(紅色箭頭)。三個紅色箭頭分別對應:客戶端編碼,MySQL Server解碼,Client編碼向表編碼的轉換。其中Terminal可以是一個Bash,一個web頁面又或者是一個APP。本文中我們假定 Bash是我們的Terminal,即用戶端的輸入和展示界面。圖中每一個框格對應的行為如下:

  • 在terminal中使用輸入法輸入
  • terminal根據字符編碼轉換成二進制流
  • 二進制流通過MySQL客戶端傳輸到MySQL Server
  • Server通過character-set-client解碼
  • 判斷character-set-client和目標表的charset是否一致
  • 如果不一致則進行一次從client-charset到table-charset的一次字符編碼轉換
  • 將轉換后的字符編碼二進制流存入文件中

從MySQL表中取出數據經歷的編碼轉換過程

上圖有3次編碼/解碼的過程(紅色箭頭)。上圖中三個紅色箭頭分別對應:客戶端解碼展示,MySQL Server根據character-set-client編碼,表編碼向character-set-client編碼的轉換。

  • 從文件讀出二進制數據流
  • 用表字符集編碼進行解碼
  • 將數據轉換為character-set-client的編碼
  • 使用character-set-client編碼為二進制流
  • Server通過網絡傳輸到遠端client
  • client通過bash配置的字符編碼展示查詢結果

#p#

造成MySQL亂碼的原因

1. 存入和取出時對應環節的編碼不一致

這個會造成亂碼是顯而易見的。我們把存入階段的三次編解碼使用的字符集編號為C1,C2,C3(圖一從左到右);取出時的三個字符集依次編號為C1’,C2’,C3’(從左到右)。那么存入的時候bash C1用的是UTF-8編碼,取出的時候,C1'我們卻使用了windows終端(默認是GBK編碼),那么結果幾乎一定是亂碼。又或者存入MySQL的時候set names utf8(C2),而取出的時候卻使用了set names gbk(C2'),那么結果也必然是亂碼

2. 單個流程中三步的編碼不一致

即上面任意一幅圖中的同方向的三步中,只要兩步或者兩部以上的編碼有不一致就有可能出現編解碼錯誤。如果差異的兩個字符集之間無法進行無損編碼轉換(下文會詳細介紹),那么就一定會出現亂碼。例如:我們的shell是UTF8編碼,MySQL的character-set-client配置成了GBK,而表結構卻又是charset=utf8,那么毫無疑問的一定會出現亂碼。

這里我們就簡單演示下這種情況

  1. master [localhost] {msandbox} (test) > create table charset_test_utf8 (id int primary key auto_increment, char_col varchar(50)) charset = utf8; 
  2.  
  3. Query OK, 0 rows affected (0.04 sec) 
  4.  
  5. master [localhost] {msandbox} (test) > set names gbk; 
  6.  
  7. Query OK, 0 rows affected (0.00 sec) 
  8.  
  9. master [localhost] {msandbox} (test) > insert into charset_test_utf8 (char_col) values ('中文'); 
  10.  
  11. Query OK, 1 row affected, 1 warning (0.01 sec) 
  12.  
  13. master [localhost] {msandbox} (test) > show warnings; 
  14.  
  15. +---------+------+---------------------------------------------------------------------------+ 
  16.  
  17. Level | Code | Message | 
  18.  
  19. +---------+------+---------------------------------------------------------------------------+ 
  20.  
  21. | Warning | 1366 | Incorrect string value: '\xAD\xE6\x96\x87' for column 'char_col' at row 1 | 
  22.  
  23. +---------+------+---------------------------------------------------------------------------+ 
  24.  
  25. 1 row in set (0.00 sec) 
  26.  
  27. master [localhost] {msandbox} (test) > select id,hex(char_col),char_col from charset_test_utf8; 
  28.  
  29. +----+----------------+----------+ 
  30.  
  31. | id | hex(char_col) | char_col | 
  32.  
  33. +----+----------------+----------+ 
  34.  
  35. | 1 | E6B6933FE69E83 | ? | 
  36.  
  37. +----+----------------+----------+ 
  38.  
  39. 1 row in set (0.01 sec) 

關于MySQL的編/解碼

既然系統之間是按照二進制流進行傳輸的,那直接把這串二進制流直接存入表文件就好啦。為什么在存儲之前還要進行兩次編解碼的操作呢?

  • Client to Server的編解碼的原因是MySQL需要對傳來的二進制流做語法和詞法解析。如果不做編碼解析和校驗,我們甚至沒法知道傳來的一串二進制流是insert還是update。
  • File to Engine的編解碼是為知道二進制流內的分詞情況。舉個簡單的例子:我們想要從表里取出某個字段的前兩個字符,執行了一句形如select left(col,2) from table的語句,存儲引擎從文件讀入該column的值是E4B8ADE69687。那么這個時候如果我們按照GBK把這個值分割成E4B8,ADE6,9687三個字,并那么返回客戶端的值就應該是E4B8ADE6;如果按照UTF8分割成E4B8AD,E69687,那么就應該返回E4B8ADE69687兩個字??梢姡绻趶臄祿募x入數據后,不進行編解碼的話在存儲引擎內部是無法進行字符級別的操作的。

#p#

關于錯進錯出

在MySQL中最常見的亂碼問題的起因就是把錯進錯出神話。所謂的錯進錯出就是,客戶端(web或shell)的字符編碼和最終表的字符編碼格式不同,但是只要保證存和取兩次的字符集編碼一致就仍然能夠獲得沒有亂碼的輸出的這種現象。但是,錯進錯出并不是對于任意兩種字符集編碼的組合都是有效的。我們假設客戶端的編碼是C,MySQL表的字符集編碼是S。那么為了能夠錯進錯出,需要滿足以下兩個條件

MySQL接收請求時,從C編碼后的二進制流在被S解碼時能夠無損

MySQL返回數據是,從S編碼后的二進制流在被C解碼時能夠無損

編碼無損轉換

那么什么是有損轉換,什么是無損轉換呢?假設我們要把用編碼A表示的字符X,轉化為編碼B的表示形式,而編碼B的字形集中并沒有X這個字符,那么此時我們就稱這個轉換是有損的。那么,為什么會出現兩個編碼所能表示字符集合的差異呢?如果大家看過博主之前的那篇 十分鐘搞清字符集和字符編碼,或者對字符編碼有基礎理解的話,就應該知道每個字符集所支持的字符數量是有限的,并且各個字符集涵蓋的文字之間存在差異。UTF8和GBK所能表示的字符數量范圍如下

  • GBK單個字符編碼后的取值范圍是:8140 - FEFE 其中不包括**7E,總共字符數在27000左右
  • UTF8單個字符編碼后,按照字節數的不同,取值范圍如下表:

由于UTF-8編碼能表示的字符數量遠超GBK。那么我們很容易就能找到一個從UTF8到GBK的有損編碼轉換。我們用字符映射器(見下圖)找出了一個明顯就不在GBK編碼表中的字符,嘗試存入到GBK編碼的表中。并再次取出查看有損轉換的行為

字符信息具體是:ਅ GURMUKHI LETTER A Unicode: U+0A05, UTF-8: E0 A8 85

 

在MySQL中存儲的具體情況如下:

  1. master [localhost] {msandbox} (test) > create table charset_test_gbk (id int primary key auto_increment, char_col varchar(50)) charset = gbk; 
  2.  
  3. Query OK, 0 rows affected (0.00 sec) 
  4.  
  5. master [localhost] {msandbox} (test) > set names utf8; 
  6.  
  7. Query OK, 0 rows affected (0.00 sec) 
  8.  
  9. master [localhost] {msandbox} (test) > insert into charset_test_gbk (char_col) values ('ਅ'); 
  10.  
  11. Query OK, 1 row affected, 1 warning (0.01 sec) 
  12.  
  13. master [localhost] {msandbox} (test) > show warnings; 
  14.  
  15. +---------+------+-----------------------------------------------------------------------+ 
  16.  
  17. Level | Code | Message | 
  18.  
  19. +---------+------+-----------------------------------------------------------------------+ 
  20.  
  21. | Warning | 1366 | Incorrect string value: '\xE0\xA8\x85' for column 'char_col' at row 1 | 
  22.  
  23. +---------+------+-----------------------------------------------------------------------+ 
  24.  
  25. 1 row in set (0.00 sec) 
  26.  
  27. master [localhost] {msandbox} (test) > select id,hex(char_col),char_col,char_length(char_col) from charset_test_gbk; 
  28.  
  29. +----+---------------+----------+-----------------------+ 
  30.  
  31. | id | hex(char_col) | char_col | char_length(char_col) | 
  32.  
  33. +----+---------------+----------+-----------------------+ 
  34.  
  35. | 1 | 3F | ? | 1 | 
  36.  
  37. +----+---------------+----------+-----------------------+ 
  38.  
  39. 1 row in set (0.00 sec) 

出錯的部分是在編解碼的第3步時發生的。具體見下圖

可見MySQL內部如果無法找到一個UTF8字符所對應的GBK字符時,就會轉換成一個錯誤mark(這里是問號)。而每個字符集在程序實現的時候內部都約定了當出現這種情況時的行為和轉換規則。例如:UTF8中無法找到對應字符時,如果不拋錯那么就將該字符替換成 (U+FFFD)

那么是不是任何兩種字符集編碼之間的轉換都是有損的呢?并非這樣,轉換是否有損取決于以下幾點:

  • 被轉換的字符是否同時在兩個字符集中
  • 目標字符集是否能夠對不支持字符,保留其原有表達形式

關于***點,剛才已經通過實驗來解釋過了。這里來解釋下造成有損轉換的第二個因素。從剛才的例子我們可以看到由于GBK在處理自己無法表示的字符時的行為是:用錯誤標識替代,即0x3F。而有些字符集(例如latin1)在遇到自己無法表示的字符時,會保留原字符集的編碼數據,并跳過忽略該字符進而處理后面的數據。如果目標字符集具有這樣的特性,那么就能夠實現這節最開始提到的錯進錯出的效果。

我們來看下面這個例子

  1. master [localhost] {msandbox} (test) > create table charset_test (id int primary key auto_increment, char_col varchar(50)) charset = latin1; 
  2.  
  3. Query OK, 0 rows affected (0.03 sec) 
  4.  
  5. master [localhost] {msandbox} (test) > set names latin1; 
  6.  
  7. Query OK, 0 rows affected (0.00 sec) 
  8.  
  9. master [localhost] {msandbox} (test) > insert into charset_test (char_col) values ('中文'); 
  10.  
  11. Query OK, 1 row affected (0.01 sec) 
  12.  
  13. master [localhost] {msandbox} (test) > select id,hex(char_col),char_col from charset_test; 
  14.  
  15. +----+---------------+----------+ 
  16.  
  17. | id | hex(char_col) | char_col | 
  18.  
  19. +----+---------------+----------+ 
  20.  
  21. | 2 | E4B8ADE69687 | 中文 | 
  22.  
  23. +----+---------------+----------+ 
  24.  
  25. rows in set (0.00 sec) 

具體流程圖如下??梢娫诒籑ySQL Server接收到以后實際上已經發生了編碼不一致的情況。但是由于Latin1字符集對于自己表述范圍外的字符不會做任何處理,而是保留原值。這樣的行為也使得錯進錯出成為了可能。

#p#

如何避免亂碼

理解了上面的內容,要避免亂碼就顯得很容易了。只要做到“三位一體”,即客戶端,MySQL character-set-client,table charset三個字符集完全一致就可以保證一定不會有亂碼出現了。而對于已經出現亂碼,或者已經遭受有損轉碼的數據,如何修復相對來說就會有些困難。下一節我們詳細介紹具體方法。

如何修復已經編碼損壞的數據

在介紹正確方法前,我們先科普一下那些網上流傳的所謂的“正確方法”可能會造成的嚴重后果。

錯誤方法一

無論從語法還是字面意思來看:ALTER TABLE ... CHARSET=xxx 無疑是最像包治亂碼的良藥了!而事實上,他對于你已經損壞的數據一點幫助也沒有,甚至連已經該表已經創建列的默認字符集都無法改變。我們看下面這個例子

  1. master [localhost] {msandbox} (test) > show create table charset_test; 
  2.  
  3. +--------------+--------------------------------+ 
  4.  
  5. Table | Create Table | 
  6.  
  7. +--------------+--------------------------------+ 
  8.  
  9. | charset_test | CREATE TABLE `charset_test` ( 
  10.  
  11. `id` int(11) NOT NULL AUTO_INCREMENT, 
  12.  
  13. `char_col` varchar(50) DEFAULT NULL
  14.  
  15. PRIMARY KEY (`id`) 
  16.  
  17. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 | 
  18.  
  19. +--------------+--------------------------------+ 
  20.  
  21. 1 row in set (0.00 sec) 
  22.  
  23. master [localhost] {msandbox} (test) > alter table charset_test charset=gbk; 
  24.  
  25. Query OK, 0 rows affected (0.03 sec) 
  26.  
  27. Records: 0 Duplicates: 0 Warnings: 0 
  28.  
  29. master [localhost] {msandbox} (test) > show create table charset_test; 
  30.  
  31. +--------------+--------------------------------+ 
  32.  
  33. Table | Create Table | 
  34.  
  35. +--------------+--------------------------------+ 
  36.  
  37. | charset_test | CREATE TABLE `charset_test` ( 
  38.  
  39. `id` int(11) NOT NULL AUTO_INCREMENT, 
  40.  
  41. `char_col` varchar(50) CHARACTER SET latin1 DEFAULT NULL
  42.  
  43. PRIMARY KEY (`id`) 
  44.  
  45. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=gbk | 
  46.  
  47. +--------------+--------------------------------+ 
  48.  
  49. 1 row in set (0.00 sec) 

可見該語法緊緊修改了表的默認字符集,即只對以后創建的列的默認字符集產生影響,而對已經存在的列和數據沒有變化。

錯誤方法二

ALTER TABLE … CONVERT TO CHARACTER SET … 的相較于方法一來說殺傷力更大,因為從 官方文檔的解釋 他的作用就是用于對一個表的數據進行編碼轉換。下面是文檔的一小段摘錄:

To change the table default character set and all character columns (CHAR, VARCHAR, TEXT) to a new character set, use a statement like this:

ALTER TABLE tbl_name

CONVERT TO CHARACTER SET charset_name [COLLATE collation_name];

而實際上,這句語法只適用于當前并沒有亂碼,并且不是通過錯進錯出的方法保存的表。。而對于已經因為錯進錯出而產生編碼錯誤的表,則會帶來更糟的結果。我們用一個實際例子來解釋下,這句SQL實際做了什么和他會造成的結果。假設我們有一張編碼是latin1的表,且之前通過錯進錯出存入了UTF-8的數據,但是因為通過terminal仍然能夠正常顯示。即上文錯進錯出章節中舉例的情況。一段時間使用后我們發現了這個錯誤,并打算把表的字符集編碼改成UTF-8并且不影響原有數據的正常顯示。這種情況下使用alter table convert to character set會有這樣的后果:

  1. master [localhost] {msandbox} (test) > create table charset_test_latin1 (id int primary key auto_increment, char_col varchar(50)) charset = latin1; 
  2.  
  3. Query OK, 0 rows affected (0.01 sec) 
  4.  
  5. master [localhost] {msandbox} (test) > set names latin1; 
  6.  
  7. Query OK, 0 rows affected (0.00 sec) 
  8.  
  9. master [localhost] {msandbox} (test) > insert into charset_test_latin1 (char_col) values ('這是中文'); 
  10.  
  11. Query OK, 1 row affected (0.01 sec) 
  12.  
  13. master [localhost] {msandbox} (test) > select id,hex(char_col),char_col,char_length(char_col) from charset_test_latin1; 
  14.  
  15. +----+--------------------------+--------------+-----------------------+ 
  16.  
  17. | id | hex(char_col) | char_col | char_length(char_col) | 
  18.  
  19. +----+--------------------------+--------------+-----------------------+ 
  20.  
  21. | 1 | E8BF99E698AFE4B8ADE69687 | 這是中文 | 12 | 
  22.  
  23. +----+--------------------------+--------------+-----------------------+ 
  24.  
  25. 1 row in set (0.01 sec) 
  26.  
  27. master [localhost] {msandbox} (test) > alter table charset_test_latin1 convert to character set utf8; 
  28.  
  29. Query OK, 1 row affected (0.04 sec) 
  30.  
  31. Records: 1 Duplicates: 0 Warnings: 0 
  32.  
  33. master [localhost] {msandbox} (test) > set names utf8; 
  34.  
  35. Query OK, 0 rows affected (0.00 sec) 
  36.  
  37. master [localhost] {msandbox} (test) > select id,hex(char_col),char_col,char_length(char_col) from charset_test_latin1; 
  38.  
  39. +----+--------------------------------------------------------+-----------------------------+-----------------------+ 
  40.  
  41. | id | hex(char_col) | char_col | char_length(char_col) | 
  42.  
  43. +----+--------------------------------------------------------+-----------------------------+-----------------------+ 
  44.  
  45. | 1 | C3A8C2BFE284A2C3A6CB9CC2AFC3A4C2B8C2ADC3A6E28093E280A1 | è¿™æ˜¯ä¸­æ–‡ | 12 | 
  46.  
  47. +----+--------------------------------------------------------+-----------------------------+-----------------------+ 
  48.  
  49. 1 row in set (0.00 sec) 

從這個例子我們可以看出,對于已經錯進錯出的數據表,這個命令不但沒有起到“撥亂反正”的效果,還會徹底將數據糟蹋,連數據的二進制編碼都改變了。

正確的方法一 Dump & Reload

這個方法比較笨,但也比較好操作和理解。簡單的說分為以下三步:

通過錯進錯出的方法,導出到文件

用正確的字符集修改新表

將之前導出的文件導回到新表中

還是用上面那個例子舉例,我們用UTF-8將數據“錯進”到latin1編碼的表中?,F在需要將表編碼修改為UTF-8可以使用以下命令

  1. shell> mysqldump -u root -p -d --skip-set-charset --default-character-set=utf8 test charset_test_latin1 > data.sql 
  2.  
  3. #確保導出的文件用文本編輯器在UTF-8編碼下查看沒有亂碼 
  4.  
  5. shell> mysql -uroot -p -e 'create table charset_test_latin1 (id int primary key auto_increment, char_col varchar(50)) charset = utf8' test 
  6.  
  7. shell> mysql -uroot -p --default-character-set=utf8 test < data.sql 

正確的方法二 Convert to Binary & Convert Back

這種方法比較取巧,用的是將二進制數據作為中間數據的做法來實現的。由于,MySQL再將有編碼意義的數據流,轉換為無編碼意義的二進制數據的時候并不做實際的數據轉換。而從二進制數據準換為帶編碼的數據時,又會用目標編碼做一次編碼轉換校驗。通過這兩個特性就相當于在MySQL內部模擬了一次“錯出”,將亂碼“撥亂反正”了。

還是用上面那個例子舉例,我們用UTF-8將數據“錯進”到latin1編碼的表中。現在需要將表編碼修改為UTF-8可以使用以下命令

  1. mysql> ALTER TABLE charset_test_latin1 MODIFY COLUMN char_col VARBINARY(50); 
  2.  
  3. mysql> ALTER TABLE charset_test_latin1 MODIFY COLUMN char_col varchar(50) character set utf8; 

博文出處:http://cenalulu.github.io/mysql/mysql-mojibake/

 

 

責任編輯:Ophira 來源: 個人博客
相關推薦

2021-07-15 06:43:11

Bash調試腳本

2018-11-28 11:20:53

Python函數式編程編程語言

2019-07-18 16:32:06

Python函數數據

2018-02-01 14:15:00

Python函數

2019-11-11 21:24:42

HadoopHbase分布式

2010-08-20 14:25:47

錯誤消息路由器

2022-03-08 08:39:22

gRPC協議云原生

2020-05-22 10:20:27

Shiro架構字符串

2018-08-30 09:01:28

Web服務器Windows 10

2016-12-22 21:47:04

SEDLinuxUnix

2021-09-06 06:31:40

理解動態規劃

2019-05-22 09:28:21

TCPUDP端口號

2024-09-18 08:21:24

JavaScriptTypeScriptprototype

2013-09-13 14:08:01

2009-10-21 18:19:36

VB.NET實現拖放

2009-11-12 16:25:35

Oracle嵌套循環

2019-07-24 09:28:36

Node.jskoa架構

2024-07-10 18:55:09

Python定時

2021-04-23 09:50:41

topLinux命令

2018-01-11 11:45:00

數據庫MySQL字符集
點贊
收藏

51CTO技術棧公眾號

久久这里只有精品18| 日本高清视频精品| 色哟哟无码精品一区二区三区| 韩国成人免费视频| 国产视频一区在线观看 | 国产伦理精品| 国产日产欧产精品推荐色| 91麻豆国产语对白在线观看| 国产免费观看av| 国产精品99视频| 国产视频欧美视频| 韩国一区二区在线播放| 欧美大胆成人| 一级做a爱片久久| 日本不卡在线播放| 天堂网2014av| 久国产精品韩国三级视频| 午夜精品久久久久久久白皮肤 | 精品国产欧美日韩| 日韩欧美三级在线| 亚洲另类第一页| 在线播放高清视频www| 亚洲人成7777| 亚洲国产欧美日韩| 能在线看的av| 99re8在线精品视频免费播放| 成人妇女免费播放久久久| 69视频免费在线观看| 国内自拍一区| 精品中文字幕在线2019| 成人欧美一区二区三区黑人一 | 水蜜桃亚洲精品| 天堂中文资源在线观看| 国产精一区二区三区| 国产狼人综合免费视频| 精品久久久久久久久久久久久久久久| 国产精品观看| 欧美精品在线极品| 国产天堂av在线| 日韩欧美电影| 深夜福利一区二区| 超碰97av在线| 日本久久黄色| 在线视频欧美性高潮| 日韩欧美视频一区二区| 亚洲一区二区三区综合| 久久久久九九精品影院| 欧美日韩免费观看一区二区三区 | 精品一区二区三区免费毛片爱 | 伊人成年综合网| 亚久久调教视频| 国产91成人在在线播放| 国产在线视频你懂的| 欧美午夜免费影院| 九九视频直播综合网| 青青操在线播放| 日韩综合精品| 久久精品国产亚洲一区二区 | 日本xxxx人| 成人午夜电影网站| 国产成人精品免费视频大全最热| 国产成人麻豆精品午夜在线| 国产一区二区三区久久悠悠色av | 加勒比色老久久爱综合网| 欧美tk丨vk视频| 日韩av手机在线播放| 色婷婷狠狠五月综合天色拍 | 欧美日韩精品电影| 九一精品久久久| 亚洲国产aⅴ精品一区二区| 日韩欧美一区二区视频| 国产伦精品一区二区三区精品| ady日本映画久久精品一区二区| 精品粉嫩超白一线天av| 双性尿奴穿贞c带憋尿| 国产精品一区二区三区av麻| 亚洲女人av| 久久精品视频在线播放| 免费看一级一片| 亚洲日本成人| 国产精品高潮在线| 国产模特av私拍大尺度| 国产不卡视频在线观看| 久久久久免费网| 国产毛片av在线| 亚洲欧美日韩在线播放| 九色在线视频观看| 欧美高清xxx| 日韩免费视频一区二区| 男女做爰猛烈刺激| 中文不卡在线| 欧美一级视频在线观看| 亚洲自拍偷拍另类| 99精品一区二区三区| 亚洲视频sss| 俺来俺也去www色在线观看| 日本韩国欧美国产| 最好看的中文字幕| 欧美三级电影在线| 久久久精品影院| 91精品国产高清一区二区三密臀| 久久激情五月婷婷| 久久人人97超碰人人澡爱香蕉| 最近高清中文在线字幕在线观看| 亚洲国产成人tv| 不卡的在线视频| 三级小说欧洲区亚洲区| 不用播放器成人网| www.亚洲激情| 不卡欧美aaaaa| 国产av不卡一区二区| 色多多在线观看| 日韩欧美国产成人一区二区| 国产一区二区三区精品在线| 韩国亚洲精品| 91系列在线观看| 国产高清视频免费最新在线| 亚洲国产成人va在线观看天堂| 91看片破解版| 欧美日韩国产高清电影| 91精品国产色综合久久不卡98| 97精品久久人人爽人人爽| 成人av午夜电影| 永久免费网站视频在线观看| 91精品美女| 亚洲精品videossex少妇| 日韩激情综合网| 蜜臀av性久久久久蜜臀aⅴ | 成人综合一区| 欧美最顶级丰满的aⅴ艳星| 精品人妻无码一区二区三区蜜桃一| 国产色爱av资源综合区| 国产三区在线视频| 美女扒开腿让男人桶爽久久动漫| 久久视频这里只有精品| 91成品人影院| 国产精品天干天干在线综合| 欧美一级黄色影院| 欧美猛男男男激情videos| 91精品国产91| 天堂网在线播放| 天天操天天色综合| 白嫩情侣偷拍呻吟刺激| 亚洲三级电影在线观看| 国产精品毛片一区视频| heyzo高清在线| 亚洲第一区在线| 日韩av在线播| 99麻豆久久久国产精品免费| 999久久欧美人妻一区二区| 亚洲国产中文在线| 九九综合九九综合| 欧美特黄一级视频| 天天综合色天天| v8888av| 天堂资源在线中文精品| 午夜精品亚洲一区二区三区嫩草 | 欧美不卡1区2区3区| 欧产日产国产精品视频| 亚洲男人天堂2019| 羞羞色院91蜜桃| 亚洲图片欧美激情| 亚洲天堂小视频| 日韩一级网站| 日本精品免费| 只有精品亚洲| 久久久久久久久久久av| 日批视频在线播放| 色综合久久中文综合久久牛| 337人体粉嫩噜噜噜| 韩国av一区二区三区在线观看| 国内自拍中文字幕| 人妖一区二区三区| 国产精品网红福利| 在线观看男女av免费网址| 亚洲白拍色综合图区| 天天操天天操天天操天天| 亚洲国产高清不卡| 三级黄色片免费看| 国产日韩亚洲欧美精品| 色播五月综合| 一区二区三区亚洲变态调教大结局 | 久久中文字幕人妻| 久久精品国产网站| 妞干网在线播放| 国产欧美一区二区三区精品观看| 国产欧美一区二区三区视频| 国产白丝在线观看| 在线播放日韩专区| 少妇人妻一区二区| 欧美日韩一区二区在线观看视频| 久久精品99国产精| 欧美经典一区二区| wwwxx日本| 久久精品国产一区二区三区免费看| 欧美黄色免费网址| 大胆日韩av| 国产精品一码二码三码在线| 国内欧美日韩| 538国产精品一区二区免费视频| 日本在线观看www| 日韩精品久久久久久久玫瑰园| 中文字幕 视频一区| 亚洲第一搞黄网站| 免费精品在线视频| 久久亚洲春色中文字幕久久久| 伊人成人免费视频| 免费一级片91| 久久综合九色综合88i| 亚洲激情五月| 亚洲欧美日韩在线综合| 欧美日韩一区二区三区不卡视频| 亚洲一区二区三区乱码aⅴ| 刘亦菲一区二区三区免费看| 久久全球大尺度高清视频| 日本激情在线观看| 在线观看日韩av| 欧美成人免费| 亚洲国产成人精品女人久久久 | 极品美女扒开粉嫩小泬| 一区二区影院| 一区二区三区不卡在线| 国产99久久| 精品欧美一区二区三区久久久| 精品一区二区三区四区五区| 91精品久久久久久久久久另类 | 免费国产一区二区| 国产精品色呦| 国产精品亚洲不卡a| 亚洲精品黑牛一区二区三区| 成人欧美一区二区三区在线| 国产精品黄色片| 国产成人中文字幕| 日韩成人动漫| 青青草成人在线| 中文字幕成在线观看| 欧美一级淫片videoshd| 热色播在线视频| 国内精品伊人久久| heyzo在线欧美播放| 午夜精品久久久99热福利| 狂野欧美性猛交xxxxx视频| 欧美成人精品激情在线观看 | 免费高清视频在线观看| 国产尤物一区二区在线| 黄色片免费网址| 国产一区二区三区精品视频| 特黄特黄一级片| 国产成人综合亚洲91猫咪| 亚洲精品久久久久久| 国产不卡高清在线观看视频| 亚洲少妇中文字幕| 成人免费毛片片v| 久久久国产精品无码| 久久欧美一区二区| 国产1区2区在线观看| 中文一区二区完整视频在线观看| 五月婷婷六月香| 亚洲另类在线视频| 久草资源在线视频| 欧美日韩精品二区| 免费黄色一级大片| 在线91免费看| 日韩一级免费视频| 亚洲免费一在线| 日韩在线观看www| 欧美成人免费网| www成人免费观看| 国产精品久久久久久久电影| 成人激情久久| 国产精品亚洲综合| 国产99精品一区| 欧美精品一区二区性色a+v| 国产精品多人| 免费在线观看的毛片| 久国产精品韩国三级视频| aaa黄色大片| 久久久久久免费网| 久久一级免费视频| 亚洲高清视频在线| 国产一卡二卡三卡| 日韩亚洲欧美中文三级| 婷婷av一区二区三区| 中文字幕亚洲综合| 日本片在线看| 国产精品免费观看在线| 日韩精品一区二区三区免费视频| 美日韩精品免费| 亚洲澳门在线| 日韩中文字幕三区| 韩国一区二区视频| 国产偷人妻精品一区| 日韩毛片一二三区| 日韩视频在线观看一区| 欧美高清激情brazzers| 香港三日本三级少妇66| 精品国产区一区二区三区在线观看| а√天堂中文在线资源8| 国产精品一区二区在线| 美女福利一区| 中国老女人av| 日本欧美在线看| 性欧美丰满熟妇xxxx性久久久| 亚洲欧美日韩久久| 销魂美女一区二区| 日韩av在线高清| 18videosex性欧美麻豆| 国产精品欧美亚洲777777| 国产伦精品一区二区三区免费优势 | 国产成人1区| www插插插无码视频网站| 精品一区二区三区久久| 中文字幕成人动漫| 疯狂欧美牲乱大交777| wwwav网站| 久久亚洲精品国产亚洲老地址| 播放一区二区| 欧美高清一区二区| 亚洲电影av| 久久av一区二区三| 亚洲女同女同女同女同女同69| 最近中文字幕免费在线观看| 精品亚洲aⅴ在线观看| 草莓视频丝瓜在线观看丝瓜18| 亚洲伊人一本大道中文字幕| 日韩伦理视频| 国内自拍视频一区| 91色综合久久久久婷婷| 日本熟伦人妇xxxx| 精品免费国产一区二区三区四区| 在线观看电影av| 91视频国产精品| 亚洲国产成人精品女人| 亚洲36d大奶网| 国产精品日韩成人| 精品一区二区无码| 亚洲欧美综合区自拍另类| 少妇淫片在线影院| 久久精品午夜一区二区福利| 狠狠入ady亚洲精品经典电影| 久草福利在线观看| 亚洲欧美色综合| 亚洲av无码片一区二区三区| 久久99视频免费| caoporn成人| 国产精品久久中文字幕| av在线综合网| 九九热在线免费观看| 日韩黄色av网站| 男人最爱成人网| 日本一区二区在线| 蜜臀av国产精品久久久久| 超薄肉色丝袜一二三| 欧美日韩国产欧美日美国产精品| 91免费在线| 成人妇女淫片aaaa视频| 亚洲欧美一区在线| 日韩少妇一区二区| 色综合天天性综合| 国产高清视频在线观看| 91精品国产综合久久男男| 欧美黄色一级视频| 女性生殖扒开酷刑vk| 疯狂蹂躏欧美一区二区精品| 黄色在线视频观看网站| 国产在线视频一区| 国产在线日韩| 国产人妻人伦精品1国产丝袜| 日本道精品一区二区三区| 日韩专区在线| 国产精品视频免费一区| 男女av一区三区二区色多| 貂蝉被到爽流白浆在线观看| 日韩一级欧美一级| 久久男人av资源站| 亚洲在线色站| 成人av电影在线| 国产又粗又猛又爽又| 精品国产一区二区三区四区在线观看| 成人免费91| 女人扒开屁股爽桶30分钟| 国产精品看片你懂得| 亚洲精品久久久久久久久久久久久久 | 蜜桃在线视频| 亚洲精品高清国产一线久久| 风间由美性色一区二区三区| 男人天堂视频在线| 久久精品夜夜夜夜夜久久| 久久97精品| 亚洲美女爱爱视频| 欧美色视频日本高清在线观看| 日本在线播放| 久久婷婷人人澡人人喊人人爽| 蜜臀av亚洲一区中文字幕| 日韩精品一区二区三| 日韩在线观看免费网站| 欧美精品中文| 日韩欧美中文视频| 欧美在线观看一区| 国内激情视频在线观看|