MySQL 8系 でのJDBC設定

そろそろ、本番環境のMySQLを8系に上げないといけないと思い、開発環境を8系にして、MyBatisで試してたところ、いきなり最初の connect でエラーが出て使えないので、調べてましたところ、

JDBCの設定記述を変えないといけないことがわかり、無事解決しました。

ここで教えて頂く : https://qiita.com/syoki/items/3d82ef00300868353572

< MyBatis Config UNPOOLED 設定例 >


  <properties>     
    
    <!-- 5.7 -->
    <!--<property name="msdriver" value="com.mysql.jdbc.Driver" />--> 
    <!-- 8 -->
    <property name="msdriver" value="com.mysql.cj.jdbc.Driver" />   
    <!-- 5.7 -->  
    <!--<property name="msurl" value="jdbc:mysql://localhost:3306/dbname?characterEncoding=utf8&amp;autoReconnect=true&amp;useSSL=false" />-->
    <!-- 8 -->
    <property name="msurl" value="jdbc:mysql://localhost/dnksg?characterEncoding=utf8&amp;autoReconnect=true&amp;useSSL=false&amp;serverTimezone=GMT%2B9&amp;rewriteBatchedStatements=true" />     
    
    <property name="msusername" value="???????" />     
    <property name="mspassword" value="??????????" />   
    

    
  </properties>

MySQL 漢字時刻文字列整数秒変換関数

Jsonでリクエストされた漢字の時刻を秒数に変換して MySQL に登録する必要あり作ってみましたが、
Javascriptであらかじめ変換してからリクエストすることにしたので、使ってません。
動作確認出来てないですが、必要な方はご利用下さい。

CREATE DEFINER=`root`@`localhost` FUNCTION `fc_intsecond_fromkanji`(
	`kanji` varchar(20)
)
RETURNS int(11)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT '漢字時間文字列整数秒数取得'
BEGIN

DECLARE CNT_SEP TINYINT DEFAULT 0;
DECLARE HMSTXT VARCHAR(20) DEFAULT '';
DECLARE FMTTXT VARCHAR(20) DEFAULT '';
DECLARE CHKNUM TINYINT DEFAULT 0;
DECLARE TP     VARCHAR(3) DEFAULT '';
DECLARE H SMALLINT DEFAULT 0;
DECLARE M TINYINT DEFAULT 0;
DECLARE S TINYINT DEFAULT 0;


SET HMSTXT = REPLACE(REPLACE(REPLACE(kanji, '時間', 'H'), '分', 'M'), '秒', 'S');
SET FMTTXT = REPLACE(REPLACE(REPLACE(kanji, '時間', ':'), '分', ':'), '秒', '');

SET TP = 
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(HMSTXT, '0', ''),
'1', ''), '2', ''), '3', ''), '4', ''), '5', ''), '6', ''), '7', ''), '8', ''), '9', '')
;


insert into tst (fld0, fld1) values (HMSTXT, TP);

IF (TP = 'HMS') THEN
  SET H = CAST(fc_delim_idxtxt(FMTTXT, 1, ':') AS UNSIGNED);
	SET M = CAST(fc_delim_idxtxt(FMTTXT, 2, ':') AS UNSIGNED);
	SET S = CAST(fc_delim_idxtxt(FMTTXT, 3, ':') AS UNSIGNED);
END IF;

/**/ 
IF (TP = 'HS') THEN
  SET H = CAST(fc_delim_idxtxt(FMTTXT, 1, ':') AS UNSIGNED);
	SET S = CAST(fc_delim_idxtxt(FMTTXT, 2, ':') AS UNSIGNED);
END IF;
IF (TP = 'HM') THEN
	SET H = CAST(fc_delim_idxtxt(FMTTXT, 1, ':') AS UNSIGNED);
	SET M = CAST(fc_delim_idxtxt(FMTTXT, 2, ':') AS UNSIGNED);
END IF;
IF (TP = 'MS') THEN
  SET M = CAST(fc_delim_idxtxt(FMTTXT, 1, ':') AS UNSIGNED);
	SET S = CAST(fc_delim_idxtxt(FMTTXT, 2, ':') AS UNSIGNED);
END IF;

/**/ 
IF (TP = 'H') THEN
	SET H = CAST(fc_delim_idxtxt(FMTTXT, 1, ':') AS UNSIGNED);
END IF;
IF (TP = 'M') THEN
	SET M = CAST(fc_delim_idxtxt(FMTTXT, 1, ':') AS UNSIGNED);
END IF;
IF (TP = 'S') THEN
  SET S = CAST(FMTTXT AS UNSIGNED);
END IF;

	 
RETURN H * 3600 + M * 60 + S;


END

MySQL ストアドファンクションから文字コード指定を消してパフォーマンス改善

MySQLの5.7から8に移行中での出来事で、ストアドが2秒程度で結果が却ってたのが、20秒程度かかってしまうので、

先日行った OSC2019 Tokyo Fall でMySQLのブースにいた人に聞いてみて、直してみると、改善できました。

全角文字を扱わない場合、文字コードは指定しない方がいいです。

< Old >

| fc_chgdvessel | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` FUNCTION `fc_chgdvessel`(
`vslnm` varchar(50)
) RETURNS varchar(36) CHARSET utf8
COMMENT '船名記号スペース変換関数'
begin

return REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(vslnm, ' ', ''), '-', ''), '.', ''), '_', ''), '(', ''), ')', ''), '.', '');

end | utf8mb4 | utf8mb4_general_ci | utf8_general_ci |

< New >

| fc_chgdvessel | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` FUNCTION `fc_chgdvessel`(
`vslnm` varchar(50)
) RETURNS varchar(36)
COMMENT '船名記号スペース変換関数'
begin

return REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(vslnm, ' ', ''), '-', ''), '.', ''), '_', ''), '(', ''), ')', ''), '.', '');

end | utf8mb4 | utf8mb4_general_ci | utf8_general_ci |

MySQL 半角カナ => ひらがな変換関数

半角カタカナが読みにくいので、ひらがなに変換するUDFを作ってみました。
濁音、半濁音は2文字になります。

パ => は°
バ => は″

ので、下に置いた変換関数をかますと正しく変換されます。

CREATE DEFINER=`root`@`localhost` FUNCTION `fc_hankana2hira`(
	`hankana` VARCHAR(200)
)
RETURNS varchar(200) CHARSET utf8
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN

DECLARE RESTXT VARCHAR(200) DEFAULT '';
DECLARE CFG_HANKANA VARCHAR(100) DEFAULT '';
DECLARE CFG_HIRA VARCHAR(100) DEFAULT '';
DECLARE LEN_HANKANA SMALLINT DEFAULT 0;
DECLARE POS SMALLINT;
DECLARE CUR_HANKANA CHAR(1);
DECLARE CUR_CFGPOS SMALLINT;
DECLARE CUR_HIRA CHAR(1);


SET CFG_HANKANA = 
'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ゙゚(). -_[]1234567890';
SET CFG_HIRA = CONCAT(
'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろ',
'わをんぁぃうぇぉゃゅょっ″°(). -_[]1234567890'
);


SET LEN_HANKANA = CHAR_LENGTH(hankana);
SET POS = 1;

WHILE POS <= LEN_HANKANA DO
	
	SET CUR_HANKANA = MID(hankana, POS, 1);
	SET CUR_CFGPOS = LOCATE(CUR_HANKANA, CFG_HANKANA);
	SET CUR_HIRA = MID(CFG_HIRA, CUR_CFGPOS, 1);
	
	SET RESTXT = CONCAT(RESTXT, CUR_HIRA);
	

  SET POS = POS + 1;
END WHILE;



RETURN fc_hankanazen_dakuon_modify(RESTXT);

END

CREATE DEFINER=`root`@`localhost` FUNCTION `fc_hankanazen_dakuon_modify`(
	`hiraorg` VARCHAR(200)

)
RETURNS varchar(200) CHARSET utf8
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT '半角カナから全角ひらがな変換した後の濁音半濁音補正'
BEGIN

DECLARE RESTXT VARCHAR(200) DEFAULT '';

SET RESTXT =
  REPLACE(
  REPLACE(
  REPLACE(
  REPLACE(
  REPLACE( 
  REPLACE(
	REPLACE(
	REPLACE(
	REPLACE(
	REPLACE(
	hiraorg, 
	'か″', 'が'),
	'き″', 'ぎ'),
	'く″', 'ぐ'),
	'け″', 'げ'),	
	'こ″', 'ご'),
	
	'さ″', 'ざ'),	
	'し″', 'じ'),
	'す″', 'ず'),	
	'せ″', 'ぜ'),
	'そ″', 'ぞ'
	); 

SET RESTXT =
  REPLACE(
  REPLACE(
  REPLACE(
  REPLACE(
  REPLACE( 
  REPLACE(
	REPLACE(
	REPLACE(
	REPLACE(
	REPLACE(
	RESTXT, 
	'た″', 'だ'),
	'ち″', 'ぢ'),
	'つ″', 'づ'),
	'て″', 'で'),	
	'と″', 'ど'),
	
	'は″', 'ば'),	
	'ひ″', 'び'),
	'ふ″', 'ぶ'),	
	'へ″', 'べ'),
	'ほ″', 'ぼ'
	); 
	
SET RESTXT =
  REPLACE(
	REPLACE(
	REPLACE(
	REPLACE(
	REPLACE(
	RESTXT, 

	
	'は°', 'ぱ'),	
	'ひ°', 'ぴ'),
	'ふ°', 'ぷ'),	
	'へ°', 'ぺ'),
	'ほ°', 'ぽ'
	); 	


RETURN RESTXT;

END

MySQL LOAD DATA LOCAL INFILE で特定列を指定してインポートする

郵政事業庁の郵便番号CSVを自分の MySQL のテーブルにインポートすることになり、必要な列だけを選べないかと探してたところ、(今まで MySQL のバルクインサートでは、全列そのまんまインポートしかしたことがなかったので)

CSVの列指定は、 @1, @3, @6 とかで、列位置指定

MySQL は、

SET
JIS_ORG = @1,
ZIP_ORG = @3,
K_NAME = @9,

とかでマッピングします。

LOAD DATA LOCAL INFILE '/????/?????.csv'
INTO TABLE mst_zip
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(@1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13, @14, @15)
SET 
JIS_ORG = @1,
ZIP_ORG = @3,
K_NAME = @9,
H_NAME_ORG = @6,
K_JIS = @8,
H_JIS_ORG = @5
;

ここで教えていただきました : http://jigsaw.hatenablog.jp/entry/2013/06/12/113016

MySQL || で SELECT列の連結

他のデータベースからの移行で、MySQLのSELECT列連結で || が使えないものかと思い、調べてると方法がわかりました。

sql_mode に、PIPES_AS_CONCAT を加えると出来ます。

[ my.cnf 例 ]

sql_mode='NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT'

[ SELECT結果例 ]

mysql> select concat(host,user,plugin) from mysql.user where user = 'root' and host = 'localhost';
+------------------------------------+
| concat(host,user,plugin)           |
+------------------------------------+
| localhostrootmysql_native_password |
+------------------------------------+
1 row in set (0.00 sec)

mysql> select host || user || plugin from mysql.user where user = 'root' and host = 'localhost';
+------------------------------------+
| host || user || plugin             |
+------------------------------------+
| localhostrootmysql_native_password |
+------------------------------------+
1 row in set (0.00 sec)

ここで教えていただきました : http://proengineer.internous.co.jp/content/columnfeature/6836#section200

MySQL 8 CTE を試す

VirtualBox の CentOS7 に入れた MySQL 8 で CTE を試してみました。

あまり参考にはならず、利用効果少ないですが、

[ 利用例 ]

貼ってから気づいたのですが、プラグインの Simple Code Highlighter が対応してなく、with が太字になってないです。


with cnttbl (ld, dc, cnt)
as (
select
	d, dc, count(id) as cnt
from
	sch_export_source
group by
	ld, dc
)

select
	dc,
	pp.CD_CNTRY,
	c.CD_REGION,

	sum(Tomakomai) as Tomakomai,
	sum(Sendai) as Sendai,
	sum(Tokyo) as Tokyo,
	sum(Chiba) as Chiba,
	sum(Yokohama) as Yokohama,
	sum(Shimizu) as Shimizu,

	sum(Niigata) as Niigata,
	sum(Toyama) as Toyama,

	sum(Nagoya) as Nagoya,
	sum(Yokkaichi) as Yokkaichi,
	sum(Osaka) as Osaka,
	sum(Kobe) as Kobe,

	sum(Mizushima) as Mizushima,
	sum(Hiroshima) as Hiroshima,
	sum(Matsuyama) as Matsuyama,

	sum(Moji) as Moji,
	sum(Hakata) as Hakata,

	sum(Kagoshima) as Kagoshima,
	sum(Naha) as Naha

from
	(
	select
		dc,

		case when (ld = 'Tomakomai') then cnt else 0 end as Tomakomai,
		case when (ld = 'Sendai') then cnt else 0 end as Sendai,
		case when (ld = 'Tokyo') then cnt else 0 end as Tokyo,
		case when (ld = 'Chiba') then cnt else 0 end as Chiba,
		case when (ld = 'Yokohama') then cnt else 0 end as Yokohama,
		case when (ld = 'Shimizu') then cnt else 0 end as Shimizu,

		case when (ld = 'Niigata') then cnt else 0 end as Niigata,
		case when (ld = 'Toyama Shinko') then cnt else 0 end as Toyama,

		case when (ld = 'Nagoya') then cnt else 0 end as Nagoya,
		case when (ld = 'Yokkaichi') then cnt else 0 end as Yokkaichi,
		case when (ld = 'Osaka') then cnt else 0 end as Osaka,
		case when (ld = 'Kobe') then cnt else 0 end as Kobe,

		case when (ld = 'Mizushima') then cnt else 0 end as Mizushima,
		case when (ld = 'Hiroshima') then cnt else 0 end as Hiroshima,
		case when (ld = 'Matsuyama') then cnt else 0 end as Matsuyama,

		case when (ld = 'Moji') then cnt else 0 end as Moji,
		case when (ld = 'Hakata') then cnt else 0 end as Hakata,

		case when (ld = 'Kagoshima') then cnt else 0 end as Kagoshima,
		case when (ld = 'Naha') then cnt else 0 end as Naha

	from
		/*  この部分を CTE にしてみる */
		/*(
		select
			ld, dc, count(id) as cnt
		from
			sch_export_source
		group by
			ld, dc
		)a*/
		cnttbl a	
	) b
	left outer join mst_ppcnv pp on (b.dc = pp.NM)
	left outer join mst_cntry c on (pp.CD_CNTRY = c.CD_CNTRY) 
group by
	dc, CD_CNTRY,
	CD_REGION
order by
  CD_CNTRY, dc;
	

HeidiSQL を 10.1.0.5464 アップデートして

MySQL でいつも使ってる HeidiSQL の 10.1.0.5464 が新リリースされたようなので、早速インストールしてみたところ、デフォルトで予約語が大文字変換されるようになっていて、(ひょっとして9.5系の設定にもあったのかも知れないが、アップデート時環境設定は引き継がれるので、新たな設定だと思う)
便利な気がしたものの、SQL文の大文字、小文字は、ケースバイケースで使い分けてるので、チェックをはずしました。
詳しくはリリースノートを見たら、書いてある気がしますので、後で見ておきます。

< Ver10.1.0.5464 環境設定 >