Mysqlのテーブルの文字コードを変更する

まずmysql のtableの文字コードを確認します。
show create table table_name
mysql> show create table items;
+——-+———————————————————————————————————————————————————————————–+
| Table | Create Table |
+——-+———————————————————————————————————————————————————————————–+
| items | CREATE TABLE `items` (
`item_id` int(11) NOT NULL AUTO_INCREMENT,
`name` text,
`price` int(11) DEFAULT NULL,
PRIMARY KEY (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+——-+———————————————————————————————————————————————————————————–+
1 row in set (0.06 sec)


utf-8なのがわかります。

[vagrant@localhost ~]$ cd /usr/share/mysql/charsets/
[vagrant@localhost charsets]$ ls
Index.xml cp1251.xml cp866.xml hp8.xml latin2.xml swe7.xml
README cp1256.xml dec8.xml keybcs2.xml latin5.xml
armscii8.xml cp1257.xml geostd8.xml koi8r.xml latin7.xml
ascii.xml cp850.xml greek.xml koi8u.xml macce.xml
cp1250.xml cp852.xml hebrew.xml latin1.xml macroman.xml
ん? なんだこれは?

とりあえず、テーブルの文字コードを変更します。
alter table table_name default character set utf8mb4;
mysql> alter table items default character set utf8mb4;
Query OK, 0 rows affected (0.16 sec)
Records: 0 Duplicates: 0 Warnings: 0

utf8mb4に変更されているのがわかります。
mysql> show create table items;
+——-+———————————————————————————————————————————————————————————————————+
| Table | Create Table |
+——-+———————————————————————————————————————————————————————————————————+
| items | CREATE TABLE `items` (
`item_id` int(11) NOT NULL AUTO_INCREMENT,
`name` text CHARACTER SET utf8,
`price` int(11) DEFAULT NULL,
PRIMARY KEY (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+——-+———————————————————————————————————————————————————————————————————+
1 row in set (0.00 sec)

こちらは変更ありません。
mysql> show variables like “chara%”;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
8 rows in set (0.00 sec)

mysql> describe items;
+———+———+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+———+———+——+—–+———+—————-+
| item_id | int(11) | NO | PRI | NULL | auto_increment |
| name | text | YES | | NULL | |
| price | int(11) | YES | | NULL | |
+———+———+——+—–+———+—————-+
3 rows in set (0.09 sec)

mysql> select * from items;
Empty set (0.07 sec)

mysql> insert into items (name) values (‘\U+1F363’);
Query OK, 1 row affected (0.06 sec)

mysql> select * from items;
+———+———+——-+
| item_id | name | price |
+———+———+——-+
| 1 | U+1F363 | NULL |
+———+———+——-+
1 row in set (0.00 sec)

あれ、なんか違くねー???

MySQLで文字コードを確認

メェー 今日は異常に疲れたぞ。。。無駄に気を張った。。明日が山場。終われば、今年もホボ終わりでござる。

ということで、MySQLで文字コードを確認したい。vagrantからmysqlにログインします。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.6.41 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

show variables like ‘%char%’と打つ
mysql> show variables like ‘%char%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
8 rows in set (0.52 sec)

character_set_client:クライアントがサーバにクエリを送信
character_set_connection:クライアントが送ったクエリをサーバが解析する際に使用
character_set_database:サーバのデフォルト
character_set_server:サービス起動時のデフォルト
character_set_system:ファイル名のcharset
character_sets_dir: charsetsのディレクトリ

う、限界だ。。

MySQLのレコードを全削除する

MySQLのレコードを全削除する

DELETEかTRUNCATEを使う。

DELETE FROM ${table_name};
TRUNCATE table ${table_name};

実際にやってみましょう。

mysql> delete from company;
Query OK, 8 rows affected (0.07 sec)

mysql> truncate table agent_mst
    -> ;
Query OK, 0 rows affected (0.17 sec)
mysql> select * from agent_mst;
Empty set (0.00 sec)

Nice

mysql insert intoで複数テーブルにinsertはできるのか?

結論から言うと、insert intoのシングルクエリで複数テーブルへのinsertはできないらしい。


なにいいいいいいいいい!?

tips♪
Oracleだとinsert allで出来るよう。mysqlはあまりニーズがないのかな?このあたりの経緯を説明できたらプロって感じがしますね。(=私はアマチュアです)

insert all
 into table1(id, coin, price) values (1, 'BTC/JPY', 437130)
 into table2(id, coin, price) values (2, 'ETH/JPY', 11703)
 into table3(id, coin, price) values (3, 'XRP/JPY', 39.04)
select * from dual;

mysqlで複数データをまとめてinsert

mysqlで複数データをinsertしたいとします。sql文はどう書けばいいのでしょうか?
insert into values の後を複数で繋げます。

INSERT INTO {table_name} (column_name1, column_name2) VALUES ('value1','value2'), ('value3', 'value4');

では実際にやってみましょう。まずsql文を作ります。データは適当に用意します。

INSERT INTO company(company_name, type, status) VALUES ('富士通', 1, 1),('リクルート', 1, 1),('日本ユニシス', 1, 1);

select * from でデータが入っているか確認します。

複数データが入っています。

MySQLでINDEXを貼るメリットと方法

indexとは何か?indexという言葉が頭に入ってこない。index.htmlと混合する。などなど。
indexは「あかさたな」でいうア行、サ行など、検索のショートカットと感がれば分かり易い。

MySQLでどんなケースだとINDEXを設定するのか?
– レコード(n)が多く、検索(O(n))に時間がかかっている
– それによってアプリケーションのパフォーマンスに影響が出る

イメージしやすいと思うが、select文での検索(O(n))の時間は Olog(n)となり、レコードの処理に時間がかかる。indexをおくと、全件検索しなくて済むので、処理時間が短くなる。

indexの種類は幾つかあるが、mysqlではB-TreeIndexが使用されている。

(あ、この図、検索アルゴリズムの本などで見たことある!!クイックソートだ。)
ということで、関連する書籍を「情報検索アルゴリズム」などのワードでamazonで調べると良いだろう。

インデックスをはると、クイックソートの並び替えが短縮されるので、処理が短くなるという算段だ。

インデックスの追加は

ALTER TABLE table_name ADD INDEX index_name(column_name);