Reference:
http://j796160836.pixnet.net/blog/post/26585908-%5Bmysql%5D%E6%9B%B4%E6%94%B9%E9%A0%90%E8%A8%AD%E8%B3%87%E6%96%99%E5%BA%AB%E7%9A%84%E7%B7%A8%E7%A2%BC
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'
[client]
default-character-set=utf8
Showing posts with label mysql. Show all posts
Showing posts with label mysql. Show all posts
Tuesday, August 30, 2011
Friday, May 27, 2011
MySQL中like查詢中文問題的解決
在做MySQL的Like查詢是發現中文搜索總是不爭取,從網上找到了幾個解決方法,大家可以看看:
方法一:
解決方法是對於包含中文的字段加上"binary"屬性,使之作為二進制比較,例如將"name char(10)"改成"name char(10)binary"。
方法二:
如果你使用源碼編譯MySQL,可以編譯MySQL時使用--with--charset=gbk 參數,這樣MySQL就會直接支持中文查找和排序了。
方法三:
可以使用Mysql 的locate 函數來判斷。 以上述問題為例,使用方法為:
SELECT * FROM table WHERE locate(field,'李') > 0;
方法四:
把您的Select語句改成這樣,SELECT * FROM TABLE WHERE FIELDS LIKE BINARY '%FIND%'即可
問題出現的原因是:在MySQL中,進行中文排序和查找的時候,對漢字的排序和查找結果是錯誤的。 這種情況在MySQL的很多版本中都存在。 如果這個問題不解決,那麼MySQL將無法實際處理中文。
出現這個問題的原因是:MySQL在查詢字符串時是大小寫不敏感的,在編繹MySQL時一般以ISO-8859字符集作為默認的字符集,因此在比較過程中中文編碼字符大小寫轉換造成了這種現象
Tuesday, November 23, 2010
Tuesday, November 16, 2010
Thursday, September 16, 2010
Monday, August 23, 2010
MySQL :: MySQL 5.0 Reference Manual :: 9.1.5 Configuring the Character Set and Collation for Applications
my.cnf:
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
Friday, August 20, 2010
[轉載]MySQL 的 "SET NAMES xxx" 字元編碼問題分析 | Vixual
先說 MySQL 的字符集問題。Windows 下可透過修改 my.ini 內的
# CLIENT SECTION
[mysql]
default-character-set=utf8
# SERVER SECTION
[mysqld]
default-character-set=utf8
這兩個字段來更改資料庫的預設字符集。第一個是客戶端預設的字符集,第二個是伺服器端預設的字符集。假設我們把兩個都設為 utf8,然後在MySQL Command Line 裡面輸入 “show variables like ‘character%’;”,可看到如下結果:
character_set_client latin1
character_set_connection latin1
character_set_database utf8
character_set_results latin1
character_set_server utf8
character_set_system utf8
其中的 utf8 隨著我們上面的設置而改動。此時,要是我們透過採用 UTF-8 的 PHP 程式從資料庫裡讀取資料,很有可能是一串 “?????” 或者是其他亂碼。網上查了半天,解決辦法倒是簡單,在連結資料庫之後,讀取資料之前,先執行一項查詢 “SET NAMES UTF8″,即在 PHP 裡為
mysql_query("SET NAMES UTF8");
即可顯示正常(只要資料庫裡資料的字元正常)。為什麼會這樣?這句查詢 “SET NAMES UTF8″ 到底是什麼作用?
到 MySQL 命令行輸入 “SET NAMES UTF8;”,然後執行 “show variables like ‘character%’;”,發現原來為 latin1 的那些變數 “character_set_client”、”character_set_connection”、 ”character_set_results” 的值全部變為 utf8 了,原來是這 3 個變數在搗蛋。
查閱手冊,上面那句等於:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
看看這 3 個變數的作用:
資料輸入路徑:client → connection → server;
資料輸出路徑:server → connection → results。
換句話說,每個路徑要經過 3 次改變字符集編碼。以出現亂碼的輸出為例,server 裡 utf8 的資料,傳入 connection 轉為 latin1,傳入 results 轉為 latin1,utf-8 頁面又把 results 轉過來。如果兩種字符集不相容,比如 latin1 和 utf8,轉化過程就為不可逆的,破壞性的。所以就轉不回來了。
但這裡要聲明一點,”SET NAMES UTF8″ 作用只是臨時的,MySQL 重啟後就恢復預設了。
# CLIENT SECTION
[mysql]
default-character-set=utf8
# SERVER SECTION
[mysqld]
default-character-set=utf8
這兩個字段來更改資料庫的預設字符集。第一個是客戶端預設的字符集,第二個是伺服器端預設的字符集。假設我們把兩個都設為 utf8,然後在MySQL Command Line 裡面輸入 “show variables like ‘character%’;”,可看到如下結果:
character_set_client latin1
character_set_connection latin1
character_set_database utf8
character_set_results latin1
character_set_server utf8
character_set_system utf8
其中的 utf8 隨著我們上面的設置而改動。此時,要是我們透過採用 UTF-8 的 PHP 程式從資料庫裡讀取資料,很有可能是一串 “?????” 或者是其他亂碼。網上查了半天,解決辦法倒是簡單,在連結資料庫之後,讀取資料之前,先執行一項查詢 “SET NAMES UTF8″,即在 PHP 裡為
mysql_query("SET NAMES UTF8");
即可顯示正常(只要資料庫裡資料的字元正常)。為什麼會這樣?這句查詢 “SET NAMES UTF8″ 到底是什麼作用?
到 MySQL 命令行輸入 “SET NAMES UTF8;”,然後執行 “show variables like ‘character%’;”,發現原來為 latin1 的那些變數 “character_set_client”、”character_set_connection”、 ”character_set_results” 的值全部變為 utf8 了,原來是這 3 個變數在搗蛋。
查閱手冊,上面那句等於:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
看看這 3 個變數的作用:
資料輸入路徑:client → connection → server;
資料輸出路徑:server → connection → results。
換句話說,每個路徑要經過 3 次改變字符集編碼。以出現亂碼的輸出為例,server 裡 utf8 的資料,傳入 connection 轉為 latin1,傳入 results 轉為 latin1,utf-8 頁面又把 results 轉過來。如果兩種字符集不相容,比如 latin1 和 utf8,轉化過程就為不可逆的,破壞性的。所以就轉不回來了。
但這裡要聲明一點,”SET NAMES UTF8″ 作用只是臨時的,MySQL 重啟後就恢復預設了。
Monday, August 9, 2010
Tuesday, July 20, 2010
debian|ubuntu ssh和mysql 連線慢問題
OS: Ubuntu
檔案: /etc/ssh/ssh_config
內容: GSSAPIAuthentication no
=================================
OS: Debian
參考原因:
Debian默認設置下是開反向域名解析的。
我們連接ssh/ftp的時候就會有一個比較明顯的延時,約等10秒後才能輸入密碼。
解決方法有兩個:
1. 將客戶機IP和域名對應關係加入到/etc/hosts上
2. 編輯/etc/nsswitch.conf
找到hosts 那行,將其改成下面這樣:
hosts: files dns [NOTFOUND=return]
(只用2也OK)
========以下是Mysql===================
my.cnf裡面加
[mysqld]
skip-name-resolve
skip-grant-tables
這樣速度就快了!
skip-name-resolve
選項就能禁用DNS解析,連接速度會快很多。
不過,這樣的話就不能在MySQL的授權表中使用主機名了而只能用ip格式。
若使用–skip-grant-tables系統將對任何用戶的訪問不做任何訪問控制,但可以用mysqladmin flush-privileges或mysqladmin reload來開啟訪問控制;默認情況是show databases語句對所有用戶開放,
如果mysql服務器沒有開遠程帳戶,就在my.cnf裡面加上skip-grant-tables
檔案: /etc/ssh/ssh_config
內容: GSSAPIAuthentication no
=================================
OS: Debian
參考原因:
Debian默認設置下是開反向域名解析的。
我們連接ssh/ftp的時候就會有一個比較明顯的延時,約等10秒後才能輸入密碼。
解決方法有兩個:
1. 將客戶機IP和域名對應關係加入到/etc/hosts上
2. 編輯/etc/nsswitch.conf
找到hosts 那行,將其改成下面這樣:
hosts: files dns [NOTFOUND=return]
(只用2也OK)
========以下是Mysql===================
my.cnf裡面加
[mysqld]
skip-name-resolve
skip-grant-tables
這樣速度就快了!
skip-name-resolve
選項就能禁用DNS解析,連接速度會快很多。
不過,這樣的話就不能在MySQL的授權表中使用主機名了而只能用ip格式。
若使用–skip-grant-tables系統將對任何用戶的訪問不做任何訪問控制,但可以用mysqladmin flush-privileges或mysqladmin reload來開啟訪問控制;默認情況是show databases語句對所有用戶開放,
如果mysql服務器沒有開遠程帳戶,就在my.cnf裡面加上skip-grant-tables
Sunday, June 6, 2010
MySQL Index(1) | Dream-ism
對於剛接觸MySQL的新手,可能會不了解索引(Index)的功用,認為反正我就建個資料庫各個Table,能讓程式Work就好
其實,建索引的目的在於幫助MySQL在搜尋時能更快找到符合你Query的結果,可以想像成,當我們在看書時,往往會在某頁貼上一個便利貼,方便我們下次閱讀
其實我們生活中常常為了我們方便而建了不少索引,所以假如您對MySQL有興趣,或是剛接觸MySQL的人,我想趁現在就開始養成建索引的習慣,即使把握住最基本
的建索引的規則,也能讓你的資料庫提升超出你想像的效率^^
MySQL索引是以B-Tree方式儲存,index可以是一個欄位或是由多個欄位複合而成。
MySQL提供多種索引類型供選擇:
1. 普通索引
這是最基本的索引類型,而且它沒有唯一性之類的限制。普通索引可以通過以下幾種方式創建:
o 創建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
o 修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
o 創建表的時候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );
2. 唯一性索引
這種索引和前面的“普通索引”基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須唯一。唯一性索引可以用以下幾種方式創建:
o 創建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
o 修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
o 創建表的時候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );
3. 主鍵
主鍵是一種唯一性索引,但它必須指定為“PRIMARY KEY”。如果你曾經用過AUTO_INCREMENT類型的列,你可能已經熟悉主鍵之類的概念了。主鍵一般在創建表的時候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我們也可以通過修改表的方式加入主鍵,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每個表只能有一個主鍵。
4. 全文索引
MySQL從3.23.23版開始支援全文索引和全文檢索。在MySQL中,全文索引的索引類型為FULLTEXT。全文索引可以在VARCHAR或者TEXT類型的列上創建。它可以通過CREATE TABLE命令創建,也可以通過ALTER TABLE或CREATE INDEX命令創建。對於大規模的資料集,通過ALTER TABLE(或者CREATE INDEX)命令創建全文索引要比把記錄插入帶有全文索引的空表更快。本文下面的討論不再涉及全文索引,要瞭解更多資訊,請參見MySQL documentation。
判斷何時該建立Index,針對哪些欄位設定為index
在性能優化過程中,選擇在哪些列上創建索引是最重要的步驟之一。可以考慮使用索引的主要有兩種類型的列:在WHERE子句中出現的列,在join子句中出現的列。請看下面這個查詢:
SELECT age ## 不使用索引 FROM people WHERE firstname=\’Mike\’ ## 考慮使用索引 AND lastname=\’Sullivan\’ ## 考慮使用索引
這個查詢與前面的查詢略有不同,但仍屬於簡單查詢。由於age是在SELECT部分被引用,MySQL不會用它來限制列選擇操作。因此,對於這個查詢來說,創建age列的索引沒有什麼必要。下面是一個更複雜的例子:
SELECT people.age, ##不使用索引 town.name ##不使用索引 FROM people LEFT JOIN town ON people.townid=town.townid ##考慮使用索引 WHERE firstname=\’Mike\’ ##考慮使用索引 AND lastname=\’Sullivan\’ ##考慮使用索引
與前面的例子一樣,由於firstname和lastname出現在WHERE子句中,因此這兩個列仍舊有創建索引的必要。除此之外,由於town表的townid列出現在join子句中,因此我們需要考慮創建該列的索引。
那麼,我們是否可以簡單地認為應該索引WHERE子句和join子句中出現的每一個列呢?差不多如此,但並不完全。我們還必須考慮到對列進行比較的操作符類型。MySQL只有對以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些時候的LIKE。可以在LIKE操作中使用索引的情形是指另一個運算元不是以萬用字元(%或者_)開頭的情形。例如,“SELECT peopleid FROM people WHERE firstname LIKE \’Mich%\’;”這個查詢將使用索引,但“SELECT peopleid FROM people WHERE firstname LIKE \’%ike\’;”這個查詢不會使用索引。
其實,建索引的目的在於幫助MySQL在搜尋時能更快找到符合你Query的結果,可以想像成,當我們在看書時,往往會在某頁貼上一個便利貼,方便我們下次閱讀
其實我們生活中常常為了我們方便而建了不少索引,所以假如您對MySQL有興趣,或是剛接觸MySQL的人,我想趁現在就開始養成建索引的習慣,即使把握住最基本
的建索引的規則,也能讓你的資料庫提升超出你想像的效率^^
MySQL索引是以B-Tree方式儲存,index可以是一個欄位或是由多個欄位複合而成。
MySQL提供多種索引類型供選擇:
1. 普通索引
這是最基本的索引類型,而且它沒有唯一性之類的限制。普通索引可以通過以下幾種方式創建:
o 創建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
o 修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
o 創建表的時候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );
2. 唯一性索引
這種索引和前面的“普通索引”基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須唯一。唯一性索引可以用以下幾種方式創建:
o 創建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
o 修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
o 創建表的時候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );
3. 主鍵
主鍵是一種唯一性索引,但它必須指定為“PRIMARY KEY”。如果你曾經用過AUTO_INCREMENT類型的列,你可能已經熟悉主鍵之類的概念了。主鍵一般在創建表的時候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我們也可以通過修改表的方式加入主鍵,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每個表只能有一個主鍵。
4. 全文索引
MySQL從3.23.23版開始支援全文索引和全文檢索。在MySQL中,全文索引的索引類型為FULLTEXT。全文索引可以在VARCHAR或者TEXT類型的列上創建。它可以通過CREATE TABLE命令創建,也可以通過ALTER TABLE或CREATE INDEX命令創建。對於大規模的資料集,通過ALTER TABLE(或者CREATE INDEX)命令創建全文索引要比把記錄插入帶有全文索引的空表更快。本文下面的討論不再涉及全文索引,要瞭解更多資訊,請參見MySQL documentation。
判斷何時該建立Index,針對哪些欄位設定為index
在性能優化過程中,選擇在哪些列上創建索引是最重要的步驟之一。可以考慮使用索引的主要有兩種類型的列:在WHERE子句中出現的列,在join子句中出現的列。請看下面這個查詢:
SELECT age ## 不使用索引 FROM people WHERE firstname=\’Mike\’ ## 考慮使用索引 AND lastname=\’Sullivan\’ ## 考慮使用索引
這個查詢與前面的查詢略有不同,但仍屬於簡單查詢。由於age是在SELECT部分被引用,MySQL不會用它來限制列選擇操作。因此,對於這個查詢來說,創建age列的索引沒有什麼必要。下面是一個更複雜的例子:
SELECT people.age, ##不使用索引 town.name ##不使用索引 FROM people LEFT JOIN town ON people.townid=town.townid ##考慮使用索引 WHERE firstname=\’Mike\’ ##考慮使用索引 AND lastname=\’Sullivan\’ ##考慮使用索引
與前面的例子一樣,由於firstname和lastname出現在WHERE子句中,因此這兩個列仍舊有創建索引的必要。除此之外,由於town表的townid列出現在join子句中,因此我們需要考慮創建該列的索引。
那麼,我們是否可以簡單地認為應該索引WHERE子句和join子句中出現的每一個列呢?差不多如此,但並不完全。我們還必須考慮到對列進行比較的操作符類型。MySQL只有對以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些時候的LIKE。可以在LIKE操作中使用索引的情形是指另一個運算元不是以萬用字元(%或者_)開頭的情形。例如,“SELECT peopleid FROM people WHERE firstname LIKE \’Mich%\’;”這個查詢將使用索引,但“SELECT peopleid FROM people WHERE firstname LIKE \’%ike\’;”這個查詢不會使用索引。
Subscribe to:
Posts (Atom)