今週頭(2020-01-13)にMySQL 8.0.xのメンテナンスリリースである8.0.19が出ました。
多くの機能が追加されましたが、本ブログではあまり他の人が取り上げなさそうなものをご紹介します。
そのうちの一つ明示表(Explicit Table)について。
リリースノートには以下の記述があります。
Important Change: MySQL now supports explicit
table clauses and table value constructors according to the SQL
standard.
VALUESについては以前以下の発表の中で触れました。Db2とPostgreSQLがサポートしている形式までいっきょにMySQL …
TL;DR
-
MySQL 8.0 で
LOAD DATA INFILE LOCALを利用するには、 - サーバとクライアント両方で
local-infileパラメータをONにする必要がある - セキュリティ強化のため、8.0から
LOAD DATA INFILE LOCALはデフォルトで無効にされた
MySQL 8.0 で LOAD DATA INFILE LOCAL が通らない
Loading local data is disabled; this must be enabled on
both the client and server sides エラー*1で
LOAD DATA INFILE LOCAL が通らなくなっていた 。
mysql> LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE tbl SET name=@1, created_at=@2; ERROR 3948 (42000): …[さらに読む]
TL;DR
| explicit_defaults_fot_timestamp | カラムのデフォルト値 | INSERTでカラム未指定 | INSERTでNULLを指定 |
|---|---|---|---|
| ON | なし | エラー | エラー |
| ON | あり | OK | エラー |
| OFF | なし | エラー | OK |
| OFF | あり | OK | OK |
explicit_defaults_for_timestamp …
[さらに読む]
訳あって、MySQLで「GEOMETRY型のカラムに、いったん
SRID=0で登録したあと、一気に正しいSRIDに変換する」ということをやろうとしたところ、思惑通りにいかず随分悩んだので、整理しておきます。
やろうとしたこととエラー発生
ここではシンプルな例に置き換えた再現実験で紹介します。
まず、GEOMETRY型を入れられるテーブルを作りデータを1件登録します。
CREATE TABLE g1 (g GEOMETRY);
INSERT INTO g1 VALUES (ST_GeomFromText("POINT(35 135)"));
SRIDを指定していないので、SRID=0で登録されています。axis-orderは lat-long です(というか、そうなっていることを期待して登録しました)。登録された内容を確認してみます。
mysql> SELECT …[さらに読む]
TL;DR
- 過去のツイート履歴がCSVからJSに変わったっぽい
- でも大丈夫、俺達には JSON_TABLE関数 があるから
かつてはCSVだったツイート履歴、最近ダウンロードしてみたらJSファイルになっていた。しかもでかい。
$ mkdir work
$ cd work
$ unzip ../twitter-2019-12-20-ce0bbf92f327035a47c135f037e0568f6166df65f5f1011bc9d0bc2b6b9b6c3f.zip
..
$ du -sh .
239M .
$ ll -h tweet.js
-rwxrwxrwx 1 yoku0825 yoku0825 47M Dec 20 09:00 tweet.js
しかもこのJS、よしなにpretty printされていてグレッパビリティが悪い。
$ head tweet.js
window.YTD.tweet.part0 = [ {
"retweeted" : false,
"source" : "<a href=\"https://mobile.twitter.com\" …[さらに読む]
DROP DATABASE IF EXISTS ... で存在しないデータベースをドロップしようとしたときに、WARNING が表示されない事象があったので紹介します。
IF EXISTS (テーブルの場合)
MySQL のDROP文には "IF EXISTS" というオプションがあり、たとえばテーブルの場合は、以下のように使います。
mysql> use test mysql> DROP TABLE IF EXISTS mytable999; Query OK, 0 rows affected, 1 warning (0.02 sec)
mytable999 というテーブルは存在しませんが、IF EXISTS
句のおかげでエラーにはならず正常終了しています。
…
TL;DR
- オンライン変更は
SYSTEM_VARIABLES_ADMIN権限。SUPERは非推奨。 -
SET PERSIST_ONLYはSYSTEM_VARIABLES_ADMIN権限 &&PERSIST_RO_VARIABLES_ADMIN権限
ふとコードを読んでいる時に SET PERSIST_ONLY には SUPER
権限は絡んでなさそうなことに気が付いたので試してみる。
/* for dynamic variables user needs SUPER_ACL or SYSTEM_VARIABLES_ADMIN */
if (!static_variable) {
if (!sctx->check_access(SUPER_ACL) &&
!(sctx->has_global_grant(STRING_WITH_LEN("SYSTEM_VARIABLES_ADMIN"))
.first)) {
my_error(ER_SPECIFIC_ACCESS_DENIED_ERROR, MYF(0),
"SUPER or SYSTEM_VARIABLES_ADMIN");
return 1;
}
} else {
/*
for …[さらに読む]
TL;DR
-
events_statements_*テーブル の
message_textカラムにエラーメッセージが入っている - MySQL 5.6とそれ以降で使える
- こんな便利なものに気が付いていなかった…
注意
- MySQL 5.6では
events_statements_historyは enabled = ‘NO’ になっているので自分でUPDATEする必要がある - events_statements_historyテーブル に記録されない場合、 events_statements_history_longテーブル …