Mysql安裝和中文排序

CentOS6.0以非root用戶安裝mysql

以非root、非yum的方式安裝mysql一般來說會遇到各種各樣的問題,網上很多帖子都說得不夠清楚,這裏將詳細過程記錄如下:

1. 先用root新建一個mysql賬號
useradd -m mysql

2. 去官網下載mysql-5.1.58.tar.gz,放在/home/mysql/software下,解壓:
tar xzvf mysql-5.1.58.tar.gz
然後進入mysql-5.1.58目錄
執行./configure –prefix=/home/mysql/local/mysql5.1.58 –with-charset=utf8
其中–prefix指的是mysql要安裝的目錄,需要預先先建目錄
接着執行make和make install。
在這個過程中如果缺少包或者編譯器,請參照CentOS 6.0安裝步驟文件的最後一步,用yum命令安裝依賴包。

3. 進入/home/mysql/local/mysql5.1.58中,新建etc目錄,然後
cp /home/mysql/local/mysql5.1.58/share/mysql/my-huge.cnf /home/mysql/local/mysql5.1.58/etc
最後將my-huge.cnf改名爲my.cnf,關鍵在後面編輯這個文件:
vim my.cnf
然後將[mysqld]中
socket = /tmp/mysql.sock
改成
socket = /home/mysql/local/mysql5.1.58/tmp/mysql.sock
最後再加上以下幾句:
log-error = /home/mysql/local/mysql5.1.58/var/mysql.err
pid-file = /home/mysql/local/mysql5.1.58/var/mysqld.pid
datadir = /home/mysql/local/mysql5.1.58/var/

這主要是因爲mysql默認情況在在/var和/etc底下沒有新建目錄和文件的權限,這樣改了後mysql將這些都建在自己的目錄下。

ps:mysql尋找my.cnf的順序爲/etc/my.cnf /etc/mysql/my.cnf /home/mysql/local/mysql5.1.58/etc/my.cnf ~/.my.cnf,可以進入/home/mysql/local/mysql5.1.58/libexec下執行
./mysqld –verbose –help | grep -A 1 ‘Default options’可以看到。這裏由於/etc和/etc/mysql下都沒有my.cnf,所以會去/home/mysql/local/mysql5.1.58/etc/my.cnf底下找。

4. 進入/home/mysql/local/mysql5.1.58/bin目錄下,執行
./mysql_install_db 安裝數據庫
然後再執行./mysqld_safe &即可以啓動數據庫

5.用root賬號登陸數據庫
./mysql -uroot

6. 讓用戶可以遠程訪問mysql
在默認情況下mysql是不允許遠程訪問的.
現在需要添加一個可以具有原創訪問的mysql賬號(需要進入mysql命令行下):
GRANT ALL PRIVILEGES ON *.* TO remote@”%” IDENTIFIED BY ‘遠程登錄的明文密碼’ WITH GRANT OPTION;

執行如下語句生效:
flush privileges;

在centos默認情況下iptables是開啓的,但並未開放3306端口,需要我們手動指定.
退出mysql,終端下輸入:
vi /etc/sysconfig/iptables
添加如下字符串
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT

重啓iptables即可:
/etc/rc.d/init.d/iptables restart
現在可以開始連接遠程的mysql數據庫了

 

我們在做聯繫人功能的時候經常需要對字符串進行排序,但有時候我們使用以下語句排序的總不成功:
select * from test order by name asc;
結果如下:

正確的結果應該是:李四,王五,張三。

怎麼在數據庫做到這一點呢?我們建表的時候需要指定表的編碼:

 
CREATE TABLE `test` (
`id` bigint(10) NOT NULL AUTO_INCREMENT,
`name` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_bin;

其中name字段採用的utf8所以排序出現異常了,應該採用gbk或者gbk2312(這個編碼集不支持某些姓氏或者繁體字)。問題又來了,有人問如果我整個表都是utf8的,而某個字段是gbk的,將來要把表裏的內容取出來還需要單獨對某個字段轉碼豈不麻煩。
這裏有個辦法,就是採用以下sql:
select * from test order by convert(name using gbk) asc;
這樣就會單獨用gbk編碼對name排序,而不影響字段本身編碼。

PS:這幾天我看到有人在找ENGINE=InnoDB AUTO_INCREMENT=4這種語句是什麼意思,這裏回答一下,這個建表語句是我直接用mysql導出工具導出來的,由於上表id設置的是AUTO_INCREMENT,同時數據庫裏面已經有3條記錄了,所以下一個id自增值是4,於是產生的建表語句告訴mysql下一條語句應該從4開始自增。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章