カテゴリー別アーカイブ: トラブルシュート

MySQL/MariaDBのワイルドカードにはlocalhostは含まれない

少なくとも、phpMyAdminでユーザを作成するとホストはワイルドカードである%となっていますが、この中にlocalhostは含まれません。従って、そのままですとローカルからはMySQLに接続できないというトラブルが発生します。この場合の対応としては以下の形でホストを変更することになります。

UPDATE mysql.user SET Host='<ホスト名>' WHERE User='<ユーザ名>';
FLUSH PRIVILEGES;

Rのwrite.csvではcol.namesが使えない

write.tableではcol.namesオプションがあり、変数名を出力せずにアウトプットができます。しかし、write.csvでは明示的にcol.namesオプションが殺されており、col.namesは指定できません。
これは、write.csvのソースコードを確認するとはっきりとします。

function (...) 
{
    Call <- match.call(expand.dots = TRUE)
    for (argname in c("append", "col.names", "sep", "dec", "qmethod")) if (!is.null(Call[[argname]])) 
        warning(gettextf("attempt to set '%s' ignored", argname), 
            domain = NA)
    rn <- eval.parent(Call$row.names)
    Call$append <- NULL
    Call$col.names <- if (is.logical(rn) && !rn) 
        TRUE
    else NA
    Call$sep <- ","
    Call$dec <- "."
    Call$qmethod <- "double"
    Call[[1L]] <- as.name("write.table")
    eval.parent(Call)
}

中を見れば判るとおり、col.namesを使えないようにしています。元々、write.csvはwrite.tableのサブセットであり、いくつかのパラメータを既定値としてセットしたものとしてデザインされています。よって、その範囲外の使い方をするには大本のwrite.tableを使うようになっています。

MySQLの怖い話

MySQLのSQLにはGROUP BY に特殊な特性があります。大多数のSQLではGROUP BY に指定されていない列をSELECT文で直接射影することは許されていません。

例えば、SELECT NAME FROM CUSTOMERS GROUP BY USER_IDのようなSQLはSQL Serverなどでは実行できません。なぜなら、USER_IDでグループ化しているためNAMEは確定しないためです。

ところが、MySQLではUSER_IDでグループ化して、それ以外の列をなんとなく取得できてしまいます。もし、NAMEがUSER_IDで一意に定まる場合には何らかの結果が得られる可能性はありますが一意に定まらないケースのほうが圧倒的に多いと考えられるので十分に書いている内容に注意してください。