Note to Self

自分用のメモ置き場

文字コードについての基礎知識

文字コードについての基礎知識

Software Design 2016年12月号の特集文字コード攻略マニュアルを読んで、自分用にまとめておく

符号化

文字をビット列で表すこと

例)じゃんけんの種別を符号化したもの

文字 符号
グー 00
チョキ 01
パー 10

文字コード

どの文字をどのようなビット列で表現するか

文字化け

表現と解釈のルールが一致しない場合、情報を正しく扱うことができない

文字コードは視覚的な表現について責務を持たない

その文字がどのように視覚的に表現されるか決定するのはフォント

文字コードの種類

  • ASCII
    American Standard Code for Information Interchangeの略
    文字コードの祖先

  • Unicode
    世界中の文字を1つの符号化文字集合に収めようとする規格
    4バイト

  • EUC-JP
    Extended UNIX Code Packed Format for Japaneseの略
    UNIX上で日本語の文字を扱う場合にもっとも多く利用されている

  • Shift_JISSJISとも呼ばれる)
    かつては日本語環境でのデファクトスタンダード

  • CP932
    MicrosoftによってShift_JISが拡張されたもの
    NEC特殊文字NEC選定IBM拡張文字、IBM拡張文字が含まれる

  • UTF-8
    1文字が1~4バイトで表現される可変長の符号化方式
    1バイト文字はASCIIそのものなので、上位互換として普及
    ひらがなや漢字は3バイトで表現される

MySQLで副問い合わせによって取得した複数のキーでデータを削除する

MySQLで副問い合わせによって取得した複数のキーでデータを削除する

MySQLで副問い合わせによって取得した複数のキーでデータを削除したい

主キー(id)に serialNo を追加し、複合主キーにしようとしたが、serialNo に同じ値が入っており、主キー制約を変更できなかった

重複する項目を削除する際に、少し悩んだのでメモしておく

-- 重複行を特定し、主キーだけのビューを作成
CREATE VIEW v_dummy AS SELECT id, serialNo FROM t_hoge GROUP BY id, serialNo HAVING COUNT(*) > 1;

-- 重複行を削除
DELETE FROM t_hoge WHERE (id, serialNo) IN (SELECT id, serialNo FROM v_dummy);

-- ビューを削除
DROP VIEW v_dummy;


一度ビューを作成する理由は、副問合せで利用したテーブルをそのまま削除することができないため

MySQLでランダムな整数値を取得する方法

ランダムな整数値を取得する方法

MySQLで INT 型のレコードの値をランダムに更新する

例)id列を 0 ~ 10で更新する

UPDATE hoge SET id = ROUND(RAND() * 10);


例)id列を 1 ~ 10で更新する(最低値を1にする)

UPDATE hoge SET id = ROUND(1 + RAND() * 9)

MySQLで空文字を検索できない場合の対処法

MySQLで空文字を検索できない場合の対処法

空文字で検索したが何故かデータが取得できない

SELECT * FROM hoge WHERE title = '';


エスケープシーケンスの\0(ASCII NUL 文字)を使うと検索できた

SELECT * FROM hoge WHERE title = '\0';

MySQLで生年月日から年齢を計算する

MySQLで生年月日から年齢を計算する

MySQLで生年月日から年齢を計算する

※birthday は DATE 型のカラムとする

SELECT 
  (YEAR(CURDATE()) - YEAR(birthday)) - (RIGHT(CURDATE(), 5) < RIGHT(birthday, 5)) AS age
FROM hoge;


または

SELECT 
  TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS age
FROM hoge;

PHPで生年月日から年齢を計算する

PHPで生年月日から年齢を計算する

(現在日付 - 誕生日) / 10000
※10000で除算することで、小数点以下を切り捨てる

<?php

$currentDate = date('Y/m/d');
$birthday = '1967/11/07';

$c = (int)date('Ymd', strtotime($currentDate));
$b = (int)date('Ymd', strtotime($birthday));
$age = (int)(($c - $b) / 10000);

/*
  結果
  var_dump($c);
  var_dump($b);
  var_dump($age);
  
  int 20170620
  int 19671107
  int 49
*/