ラベル MySQL の投稿を表示しています。 すべての投稿を表示
ラベル MySQL の投稿を表示しています。 すべての投稿を表示

2009年6月22日月曜日

MySQL プロシージャ実行時に文字化けとか Incorrect string value とか

ブラウザの文字コード UTF-8

mysql> status
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Server characterset:    latin1
Db     characterset:    utf8
Client characterset:    latin1
Conn.  characterset:    latin1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

エラーがなく通るも、画面上で文字化け

mysql> charset utf8
mysql> status
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Server characterset:    latin1
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

プロシージャ実行中にエラー
ERROR 1366 (HY000): Incorrect string value: 'xxxxxxxxx' for column 'xxxxxxxx' at row xx

mysql> SET character_set_client = sjis;
mysql> status
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Server characterset:    latin1
Db     characterset:    utf8
Client characterset:    sjis
Conn.  characterset:    latin1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

エラーなく通るも、画面上で文字化け

mysql> SET character_set_client = sjis;
mysql> SET character_set_connection = utf8;
mysql> status
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Server characterset:    latin1
Db     characterset:    utf8
Client characterset:    sjis
Conn.  characterset:    utf8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

問題なく通る

2009年5月19日火曜日

MySQL で小数点以下を「切り捨て」する

TRUNCATE(n, m)
n -- 任意の数値 m -- 切捨てる小数点以下の桁数
mysql> SELECT TRUNCATE(1024.768, 0);
+-----------------------+
| truncate(1024.768, 0) |
+-----------------------+
|                  1024 |
+-----------------------+
1 row in set (0.02 sec)
Oracle 等の TRUNC()は、桁数を省略できるようだけど(0とみなされる)、MySQLではできない様子。

MySQLやってて で知ったこと

now() に数値をプラスすると、数値になる。
-- 普通
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-05-19 18:06:04 |
+---------------------+
1 row in set (0.00 sec)

-- 数値で
mysql> select now() + 0;
+-----------------------+
| now() + 0             |
+-----------------------+
| 20090519180657.000000 |
+-----------------------+
1 row in set (0.00 sec)

-- 明日
mysql> select now() + 1000000;
+-----------------------+
| now() + 1000000       |
+-----------------------+
| 20090520180610.000000 |
+-----------------------+
1 row in set (0.00 sec)
っていうか、色々数値を突っ込んでみると数値になる?
mysql> SELECT 0x61;
+------+
| 0x61 |
+------+
| a    |
+------+
1 row in set (0.00 sec)

mysql> SELECT 0x61 + 1;
+----------+
| 0x61 + 1 |
+----------+
|       98 |
+----------+
1 row in set (0.00 sec)

2009年4月27日月曜日

ASP.NET C# と MySQL で 引数を指定するストアドプロシージャを使う


// DB接続
String param = "server=localhost;user id=my_user; password=1234; database=my_db; Pooling=false;";
MySqlConnection conn = new MySqlConnection(param);
conn.Open();

// プロシージャ名を指定した MySqlCommand インスタンスの生成
MySqlCommand cmd   = new MySqlCommand("my_proc1", conn);
cmd.CommandType    = CommandType.StoredProcedure;

// 入力パラメータの追加
MySqlParameter prm = new MySqlParameter("p_id", MySqlDbType.Int16);
prm.Direction      = ParameterDirection.Input;
prm.Value          = 10;
cmd.Parameters.Add(prm);

// 発行と内容取得
MySqlDataReader reader = cmd.ExecuteReader();
if (reader != null) {
    while (reader.Read()) {
        for (int i = 0; i < reader.FieldCount; i++) {
            Label1.Text += reader.GetName(i) + " : " + reader.GetValue(i) + "
"; } } reader.Close(); } conn.Close();

2009年4月24日金曜日

MySQL のセッションの調査と切断

-- セッションの表示
show processlist;

-- セッションの切断
kill [processId];

2009年4月23日木曜日

MySQL のストアドプロシージャ

MySQL のストアドプロシージャを利用するためのコマンド類。
-- 区切り文字を変更する
-- ※スクリプト中のセンテンスの終了に「;」を使用するため、変更する。
DELIMITER //

-- ストアドプロシージャの作成
CREATE PROCEDURE my_proc1()
BEGIN 
  SELECT my_id, my_name FROM my_table;
END
//

-- ストアドプロシージャの呼び出し
CALL my_proc1()
//

-- 戻り値つきストアドプロシージャ
CREATE PROCEDURE my_proc2(OUT param1 INT)
BEGIN
  SELECT COUNT(*) INTO param1 FROM my_table;
END
//

-- 戻り値つきストアドプロシージャの呼び出し
CALL my_proc2(@a)
//

-- 戻り値の確認
SELECT @a

-- 引数つきストアドプロシージャ
-- 文字列を結合する
CREATE PROCEDURE my_proc3(IN param1 VARCHAR(50), OUT param2 VARCHAR(50))
BEGIN 
  SELECT CONCAT('Hello, ', param1,'!') INTO param2;
END
//

-- 引数つきストアドプロシージャの呼び出し
CALL my_proc3('world', @a)
//

-- 作成したプロシージャの確認
SHOW PROCEDURE STATUS
//

-- 作成したプロシージャの内容確認
SHOW CREATE PROCEDURE my_proc1
//

-- 作成したプロシージャの削除
DROP PROCEDURE my_proc1
//


2009年4月17日金曜日

MySQL のセットアップ

ODBC の設定から CSE での接続まで。

環境

  • windowsXP SP3
  • MySQL 5.1
  • Connector/ODBC 5.1.5
  • Common SQL Environment 1.59

手順

ODBCの設定などは、公式サイトの手順通り、下記の順番で進めばでOK。

  1. 24.1.2.1. Connector/ODBC の入手方法
  2. MySQL Connector/ODBC 5.1 Downloads
    環境に合わせて。特に問題なければ Windows MSI Installer (x86) で。
  3. 24.1.2.3.1.1. インストーラを使用して Windows Connector/ODBC ドライバをインストールする
  4. 24.1.3.2.1. Windows での Connector/ODBC DSN の追加
    Data Source Name, Description は適当で。Server は書いてある通り。User, Password は有効なものを。

接続

CSE での接続。

  1. つみきWebさんからダウンロード。
  2. 適当な場所に解凍&実行。
  3. データベース->接続 を開く。
  4. DBMS: で ODBC汎用 を選択。
  5. データソース: で先ほど作った Data Source Name を選択。
  6. ユーザ名とパスワードは空にするとデフォルト値を適用。
  7. OK で接続。

※エラーが出るようなら、一度 windows を再起動。

MySql の基本的なコマンド

ログイン(PATHが通っている場合)

C:\> mysql -u my_user -p my_db;

データベース操作

-- データベースの確認
SHOW DATABASES;

-- データベースの作成
CREATE DATABASE my_db;

-- データベースを選択する
USE my_db;

ユーザ操作

-- SELECT、INSERT、UPDATE、DELETEができるユーザの追加
GRANT SELECT, INSERT, DELETE, UPDATE ON *.* TO my_user IDENTIFIED BY '1234';

-- 登録されているユーザを確認する。
SELECT Host, User, Password FROM mysql.user;

-- root のパスワードを変更する。
SET PASSWORD FOR root@localhost=PASSWORD('admin');

テーブル操作

-- DBに存在するテーブルを見る
SHOW TALBES;

テーブルを作成する

CREATE TABLE my_table ( 
      my_id INT NOT NULL AUTO_INCREMENT
    , my_name VARCHAR(255) NOT NULL DEFAULT 'hogeo'
    , PRIMARY KEY (my_id)
);

テーブル名の変更

ALTER TABLE my_table RENAME TO your_table;