顯示具有 MySQL 標籤的文章。 顯示所有文章
顯示具有 MySQL 標籤的文章。 顯示所有文章

2018年8月16日 星期四

MySQL Java emoji support

前言

現在只要做 mobile 服務都必須支援 emoji 等表情符號
雖然 AWS Aurora DB 已經設定好 character set utf8mb4 , utf8mb4_unicode_ci,想說應該這樣就沒問題了,沒想到還是被我踩到 mysql-connector-java library 的地雷

錯誤訊息

class org.springframework.jdbc.UncategorizedSQLException:PreparedStatementCallback; 
uncategorized SQLException for SQL [update example set content = ?, updateDate = sysdate() where id = ?]; 
SQL state [HY000]; error code [1366]; 
Incorrect string value: '\xF0\x9F\x98\x80\xF0\x9F...' for column 'content' at row 1; 
nested exception is java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x80\xF0\x9F...' for column 'content' at row 1

解決辦法

很簡單,就是將 mysql-connector-java library 升級到 5.1.13 之後的版本就可以了!!
Connector/J now auto-detects servers configured with character_set_server=utf8mb4 or treats the Java encoding utf-8 passed using characterEncoding=… as utf8mb4 in the SET NAMES= calls it makes when establishing the connection. (Bug #54175)

Reference

2010年11月17日 星期三

Mysql中count(*),DISTINCT的使用方法和效率研究

在處理一個大數據量數據庫的時候
突然發現mysql對於count(*)的不同處理會造成不同的結果

比如執行
SELECT count(*) FROM tablename
即使對於千萬級別的數據mysql也能非常迅速的返回結果
而對於
SELECT count(*) FROM tablename WHERE…..
mysql的查詢時間開始攀升

仔細查閱累下手冊,發現當沒有WHERE語句對於整個mysql的表進行count運算的時候
MyISAM類型的表中保存有總的行數,而當添加有WHERE限定語句的時候Mysql需要對整個表進行檢索
從而得出count的數值

突然又想起來看到的不少新興的php程序對於count的處理並沒有很好的意識到這點
記錄下

順便提下mysql的DISTINCT的關鍵字有很多你想不到的用處

2010年7月19日 星期一

CASE 指令,MySQL 的 switch 與 if else



  1. 必須依附在 SELECT,UPDATE,INSERT,DELETE 下
  2. 不可用在區段中加其他動作
  3. 具有 switch 與 if else 兩種架構


-- switch 的用法
SELECT CASE col
WHEN 100 THEN '1'
WHEN 50 THEN '2'
ELSE '3'
END
FROM table;



-- if else 的用法
SELECT CASE
WHEN col>100 THEN '1'
WHEN col>50 THEN '2'
ELSE '3'
END
FROM table;



-- IFNULL 的用法
SELECT IFNULL(a.col, b.col)
FROM table1 as a,table2 as b;

2010年4月12日 星期一

Linux下mysql中文問題

操作系統環境:

CentOS4.8、MySQL 5.1.45

現象:

在此電腦上安裝了Tomcat作為web服務器,部署了一個項目,通過jdbc連接到mysql數據庫。但是發現中文輸入輸出亂碼現象。

解決步驟:

1. 找到mysql的配置文件

網上說,mysql的配置文件就是/etc/my.cnf。但是這個文件並不一定存在,由於你可能採取的MySQL安裝方式跟網上所說的不一樣,就不一定能夠找得到/etc/my.cnf。因此,你需要使用find命令查找cnf文件。記得不要去找my.cnf因為它不一定存在,而應該找*.cnf。

2010年4月8日 星期四

Linux下mysql大小寫問題

1、Linux下mysql安裝完後是默認:區分表名的大小寫,不區分列名的大小寫;


2、用root帳號登錄後,在/etc/my.cnf 中的[mysqld]後添加添加lower_case_table_names=1,重啟MYSQL服務,這時已設置成功:不區分表名的大小寫;



MySQL帳號與權限設定

當有多人使用MySQL Server時,若都以MySQL管理者root身份登入,這是很危險的事情。root什麼事情都可以做,所以為了避免root密碼外洩造成資料庫資安風險提高,建議另外新增帳號,並賦予適當的存取權限。

--------------------------------------------------------------------------------
請以MySQL管理者root身份登入MySQL,你可以使用「grant on」指令新增使用者與權限的調整。當使用者不存在時會建立帳號,若存在則會變更權限,grant on指令基本設定如下:
grant 權限 on 資料庫.資料表 to 帳號@主機 identified by‘密碼’