MySQLのCollationについて

このQ&Aのポイント
  • MySQLのCollationについての質問
  • MySQLにおけるCollationの設定方法について知りたい
  • MySQLでのデフォルトのCollationの使われ方について
回答を見る
  • ベストアンサー

MySQLのCollationについて

MySQLを使い始めたばかりものです。 SQLの学習のために下記ページのExample Databasesからworld database(InnoDB)をダウンロードし、インポートしました。 * http://dev.mysql.com/doc/index-other.html * http://dev.mysql.com/doc/world-setup/en/index.html そして、次のようなSQLを実行して countrycode列の値が 'JPN' の行が選択されることにびっくりしました。 mysql> select * from city where countrycode = 'jpn'; (1)Collationというものが関係することはわかったのですが、どうすればいいのかわからない状況です。 world database を PostgreSQL のようにデフォルトで大文字/小文字を区別して比較するようにしたいのですが、具体的にどのように設定したらよいのでしょうか? (2)要件によるとは思いますが、データベースのデフォルトのCollationはcase-insensitiveで、必要に応じて列を case-sensitive にしたり、select文に collate句を付加したりしているような使われ方が、MySQLでは一般的なのでしょうか? それとも、Collationにcase-sensitiveなものを指定してデータベースを作成し、必要に応じて列を case-insensitive 扱いするケースの方が圧倒的に多いのでしょうか? ■環境 * Linux Mint 17 Mate * MySQL 5.5.43 以下の設定を my.cnf に追加 - 文字コード関連をutf8に設定 - lower_case_table_names = 1 よろしくお願いします。

noname#241088
noname#241088
  • MySQL
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

MySQLでは様々な言語(というかキャラクターセット)を取り扱う事ができるが、そのほとんどでデフォルトのCollationはアルファベットの大文字と小文字を区別しないようになっているね。キャラクターセットをUTF8にしてCollationを指定しない場合、Collationはutf8_general_ciというものになり、これはアルファベットの大文字と小文字を区別しない。キャラクターセットがUTF8の時に使用できるCollationは他にutf8_binとutf8_unicode_ciがある。お察しの通り大文字と小文字を区別するようにするためのCollationはutf8_binだ。utf8_unicode_ciは私は使った事無いが日本語のカタカナとヒラガナとかも含めてcase-insensitiveになるらしい。 (1)なので、Collationを指定する。Collationはテーブルカラムに対して行われるので mysql> alter table <テーブル名> modify <カラム名> collate utf8_bin; 面倒であればmysqldumpでダンプを取った後、データベースのデフォルトCollationを変更するか作りなおしてからインポートするといいだろう。 mysql> alter database <データベース名> default character set utf8 collate utf8_bin; (2)冒頭で説明した通りMySQLではほとんどのキャラクターセットのCollationデフォルト値がcase-insensitiveだ。が、多分ほとんどの人は知らずにciのまま使っていると思われる。問題が発生するまではciを使っていることすら意識していないのではないだろうか。 私個人の話になるが、私は(Key-Valueでいうところの)Value値となる項目(例えばブログ記事テーブルのようなものがあればそれのタイトル列や本文列)はci、ハッシュ値となるKey値はci、ID(Primary Key)となるKey値はcsとciを要件によって使い分けている。 > 以下の設定を my.cnf に追加 > - 文字コード関連をutf8に設定 > - lower_case_table_names = 1 このパラメータはファイル名に大文字小文字の区別がない(←正確には違う)Windowsで意味があるもので、Linuxでは不要というか逆に混乱の元になるので0にする方が良いだろう。MySQLはデータベース名はOSディレクトリ、テーブル名はOSファイルと密接に関わるのでこのようなパラメータがある。 大本のデフォルト値を操作したい場合、my.cnfの[mysqld]セクションに collation-server = utf8_bin collation-database = utf8_bin collation-connection = utf8_bin というパラメータを入れるといい。

noname#241088
質問者

お礼

anmochiさん 詳細で丁寧な解説ありがとうございます。 おかげさまで Collation についてだいぶ理解できるようになり、utf8_binで利用できるようになりました。 各テーブルの各カラムに対して個別に設定する必要があったのですね。 また、次のようにすればよいことも確認できました。 (1) "default charset=utf8 collate utf8_bin" でデータベースを作る。 (2) MySQLのサイトからダウンロードしてきたworldデータベースをインポートするためのsqlファイル(これ自体mysqldumpで出力したものだったのですね)の create table文での文字コードの指定を latin1 から utf8 に修正し、collate utf8_bin を追加する。 (3) 新規に作成したDBに対して、修正したsqlファイルを実行する。 > 多分ほとんどの人は知らずにciのまま使っていると思われる。問題が発生するまではciを使っていることすら意識していないのではないだろうか。 デフォルトの設定値が ci であることに驚き、MySQLユーザーの反応がどんなものか検索してみたのですが、想像していたよりもずっと冷静に受け止められているように感じたので、自分の感覚がおかしいのか? と不安に思い質問させて頂きました。 おっしゃる通り、知らないで使ってる方も少なくないでしょうし、知ってる方はデータベース作成時に指定しておけば良いという感じなのでしょうね。 最初は混乱しましたが、今は「こういうRDBMSもあるんだな」という感覚に落ち着きました :) lower_case_table_namesの件といいますか、テーブルの命名規則についてもちょっと疑問に思っていることがあるのですが、一旦頭の中を整理して改めて質問させて頂こうかと思っています。 また、その時はよろしくお願いします。 どうもありがとうございました。

関連するQ&A

  • MySQLデータベースリカバリ文字コード指定

    Windows環境でのMySQLのデータベースバックアップで、以下のように文字コードを指定してバックアップが行われています。 mysqldump -uユーザ名 -pパスワード --default-character-set=sjis データベース名 > ****.sql バックアップからリストアするのですが、同じサーバ上で既存の同じデータベース(名)があるので 一度DROP DATABASE データベース名;してからCREATE DATABASE データベース名;を行うつもりです。 以下の2点について教えてください。 (1)create databaseする際に文字コードを指定する必要がありますでしょうか? create database データベース名 CHARACTER SET sjis; (2)リストア実行時に文字コードを指定する必要がありますでしょうか? mysqldump -uユーザ名 -pパスワード --default-character-set=sjis データベース名 < ****.sql 因みに ※my.iniには文字コードの指定で、sjis指定の表記がありました。 ※Moveble TypeでMySQLをデータベースとして使用しています。  よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MYSQLでの文字化け

    php(utf-8)を使ってmysqlで簡単なサイトを作ってみましたが, 日本語をフォームから入力して、表示するとき、ブラウザではまったく問題ないのですが、 phpMYadminでデータベースを開くとの日本語部分が文字化けして読めません。 ローカルでは問題ないので、サーバーの問題かとおもい、 他のサーバー(ロリポップ)にphpとsqlをテストでコピーしてみましたら大丈夫でした。 何かの設定かと思い、 mysql> SHOW VARIABLES LIKE 'char%';でチェックし比べてみたところ 正常(ローカル、ロリポップともに)のものは character set client utf8 character set connection utf8 character set database utf8 なのに 文字化けするほうは(北米のサーバー) character set client latin1 character set connection latin1 character set database latin1 でした。文字コードのデフォルトが違うからだと思い、ググって見たところ、 結構よくある問題で、my.cnf でデフォルト文字設定utf-8に変更するなどで解決できるとありました。 でも、使っているサーバーは予めphpMYadminがインストールされているレンタルサーバーであるのでmy.cnfはさわれないのでは??? サーバー会社に連絡して変更可能かと聞いたところ、my.cnfを変更することはできません。またデータベースのサポートはいたしません。と冷たく返答。サーバー会社を変えたいところですが、自分が借りたサーバーではないのでそのまま使うしかありません。 ただ、教わった、sqlコマンドからALTER DATABASE <your_database_name> CHARACTER SET utf8 COLLATE utf8_general_ci を実行したところcharacter set databaseのみutf8になりました。(文字化けは一緒) character set connection とcharacter set database をmy.cnfをいじらず、sqlコマンドで変更可能なのでしょうか? もし、無理ならばどのような方法があるのでしょうか? サイトのフォームからの送信と受信はUTF-8に設定しています。 (だからだとおもいますが、ブラウザの表示だけは文字化けせずにでます。) お知恵がありましたらよろしくお願いします。

    • ベストアンサー
    • MySQL
  • データベースのインポートができません(MySQL)

    ●質問の主旨 下記のサイトを見ながら、データベースのテーブルを インポートしようとしていますが、エラーが出ます。 この場合、phpmyadminのどこを確認すればよいでしょうか? ご存知の方、ご教示願います。 http://www.dbonline.jp/phpmyadmin/export-import/index3.html ●開発環境 windows8 xammp1.8.1 ●エラーの内容(添付画像) エラー 実行した SQL: -- -- データベース: `mydb10` -- CREATE DATABASE `mydb10` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; MySQL のメッセージ: #1007 - Can't create database 'mydb10'; database exists ●インポートの内容(mydb.sql) -- phpMyAdmin SQL Dump -- version 3.5.2.2 -- http://www.phpmyadmin.net -- -- ホスト: 127.0.0.1 -- 生成日時: 2013 年 4 月 20 日 08:27 -- サーバのバージョン: 5.5.27 -- PHP のバージョン: 5.4.7 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; -- -- データベース: `mydb10` -- CREATE DATABASE `mydb10` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; USE `mydb10`; -- -------------------------------------------------------- -- -- テーブルの構造 `db10` -- CREATE TABLE IF NOT EXISTS `db10` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` text NOT NULL, `address` text NOT NULL, `tel` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; -- -- テーブルのデータのダンプ `db10` -- INSERT INTO `db10` (`id`, `name`, `address`, `tel`) VALUES (1, 'あああ', 'いいい', '111'), (2, 'ううう', 'えええ', '222'), (3, 'おおお', 'かかか', '333'); /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

    • ベストアンサー
    • MySQL
  • mysqlの文字化けが治せません・・・;;

    現在、MYSQL+PHPを勉強中の初心者なのですが PHPにて作成したフォームデータをレンタルサーバ上のデータベースへと入力するプログラムを作成したのですが送られた日本語データがphpmyadminで確認すると全て文字化けしてしまいます。 また、データベースのデータをブラウザ上に表示するPHPプログラムでもブラウザ上では文字化けしています。 おそらく、MYSQLの文字コードの指定がまずいとおもうのですがその指定する方法がわかりません。 サーバのOSはFREEBSDで MYSQLは4.0を使用しています。 telnetを使用して、サーバにはアクセスしています。 各charsetは変数、セッション値、グローバル値の順に client utf8 latin1 connection sjis latin1 database latin1 latin1 results utf8 latin1 server latin1 latin1 system utf8 utf8 character sets dir /usr/local/share/mysql/charsets/ /usr/local/share/mysql/charsets/ collation connection sjis_japanese_ci latin1_swedish_ci collation database latin1_swedish_ci latin1_swedish_ci collation server latin1_swedish_ci latin1_swedish_ci となっています。 この質問掲示板も確認したのですが my.cnfやmy.ini等のファイルがサーバ上に 見つからず質問させて頂いております。 どうぞ、よろしくお願い致します。

  • MySQL + Excel したい!

    ExcelのVBAとMySQLを使っていろいろ実験してます。 ひとりでは、どうしても解決に時間がかかったり、分からないことがあるので、分かる方に教えていただけたらと思います。 Excelにデータベースのデータを読み込んだり、Excelで入力したり、計算したしたものを、またデータベースに入力したりしています。どうしても解決したいことが、以下の(1)(2)です。 (1)プログラムの一部ですが、 Set Rs = New ADODB.Recordset sql="select count(*) from yotei" Rs.Open sql, Cn 'Cnはデータベースへの接続 ADODB.Connection Rs.MoveFirst Range("A1").CopyFromRecordset Rs 'いったんワークシートに結果を転送 count = Range("A1").Value 'ワークシートから値を取得 結果のレコードセットから希望の1行1列を取り出す方法でつまづきました。Rs.GetRowsなど使い方が分かりませんでした。 例えばテーブルのレコード数などを調べたときの結果は1行1列しかないんですけど、上を見ての通り、不効率なことをしてしのいでます。 (2)LANでつないだ他のパソコンから、このパソコンのデータベースに接続したいです。何が(どうすることが)必要ですか? 接続文字列 DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost; DATABASE=test; UID=root; OPTION=3 のSERVER=のところを変えるだけで済むのでしょうか?これだけではだめですよね?パソコンやLANでどんな設定をしなくてはならないでしょう? 説明が悪かったらごめんなさい。やりたいのにできなくて、かなり悩んでます。

  • MYSQLの文字化けについて

    MYSQLの文字化けについて質問させてください。 MYSQL COMMAND LINE CLIENTでMYSQLに作ったデータベースに下記のSQL文でデータを入れると、下記のエラーが出ます。 sql 「insert into テーブル名 (id、type)values (1,'男性’);」 エラー文 incorrect string value: '入力文字が文字化けして表示’for column 'type’at row 1 文字化け対策として、調べたところ、下記のように「my.ini」に記述すると言うことでしたので、試してみました。 [mysql] default-character-set=utf8 [mysqld] default-character-set=utf8 skip-character-set-client-handshake [mysqldump] default-character-set =utf8 ちなみにその他情報です。 MySQLのバージョン MySQL 5.1 MySQLで有効になっている文字コード 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 何かお解かりになることがありましたら、宜しくお願いします。

  • mysql4 から5のバージョンアップで大失敗?

    「WP+さくらインターネット」の組み合わせでホームページをすでに5年も展開していました。 Wordpressのバージョンが古く、そのためデータベースのバージョンアップを求められ様々なサイトを参考にしてMy SQLを4から5にバージョンアップを挑戦しました。 いろいろサイトを確認して慎重に作業を行い、UTF-8にてPHPMyAdminへログイン。 「構造」欄の「DROP TABLEを追加」と「IF NOT EXISTSを追加」にチェックを入れデータベースのエクスポート。 terapadというテキストエディタにて上から20行目あたりにあるCREATE DATABASEの前に--を入れました。 その後、旧データベースを削除。 そして新しいデータベースを作成。 PHPMyAdminに再度ログインし、新しいデータベースを選択。「操作」タブにて「照合順序」をutf8_generalciに変更し、sqlファイルをインポートしたところ 「#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '--CREATE DATABASE `sankei-kouki`' at line 4 」と出てきました。 なぜだ?なぜだ?と再度さまざまなサイトをみながら対応策を調べてみました。 再度テラパッドにてsqlファイルを確認すると下記のものです。ちなみに「〇〇〇〇」は私のHPにあった任意の文字列です。 -- phpMyAdmin SQL Dump -- version 2.11.11.3 -- http://www.phpmyadmin.net -- -- 繝帙せ繝・ mysql68.db.sakura.ne.jp -- 逕滓・譎る俣: 2014 蟷エ 6 譛・18 譌・ 10:58 -- 繧オ繝シ繝舌・繝舌・繧ク繝ァ繝ウ: 4.0.27 -- PHP 縺ョ繝舌・繧ク繝ァ繝ウ: 5.3.22 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; -- -- 繝・・繧ソ繝吶・繧ケ: `〇〇〇〇` -- --CREATE DATABASE `〇〇〇〇`; --USE 〇〇〇〇; いくつかの参考サイトにあった「文字化け」というのは、このことを言っていたのかもしれません。 注意していたのはインポート後の「文字化けをしないように」という事で、ここでは文字化けを気にせず「CREATE DATABASE」と「USE」の前に--を入れる事だけに集中していました。 すでに旧データベースは削除済み。もう私のホームページはすべてが終わってしまったのでしょうか? 助けてください(大泣)。

  • 【至急】さくらサーバーMySQLインポート出来無

    誰か助けて下さい!! さくらインターネットのデータベースで、 MySQLのヴァージョンが低くて、 設置不能のブログ(ワードプレス等)があったので、 ヴァージョンを最新する方法を探していました。 「一回消して再登録する」という記事を読んで、 バックアップも取った上で再登録したのですが、 データをインポートできません。 以前のものは mysql24.db.sakura.ne.jp 今回のは mysql443.db.sakura.ne.jp です。 エクスポートしたデータは「SQL」 「SQL圧縮」「 CSV 」の3つで保存してあります。 再度データベースを作るときにデータベース名を入力する欄がありましたが 以前使っていたものには、そんな入力は要求されなかったような気がします。 もしかしたら、それが原因かも…と思っているのですが、 お分かりになる方いらっしゃいませんでしょうか。 エラーはこちら *-------------------------* エラー 実行した SQL: -- -- データベース: `aaa_01` -- CREATE DATABASE `aaa_01` ; MySQLのメッセージ: #1007 - Can't create database 'aaa_01'; database exists *------------------------------*

  • PHPからMySQLのデータベースが作成できない

    PHP:4.4.4 MySQL:4.1.21 です。 PHPからデータベースを作りたいのですがうまくいきません。 以下のように記述しています。 $sql = "CREATE DATABASE ".$DBNAME; $rst = mysql_query($sql,$con); $DBNAMEには作りたいデータベースの名前が入っています。また、$conにはIDが入っており接続はできているようです。しかしこの後で$rstをechoするとTRUEでもFALSEでもなく、何も入っていない状態です。 これはどうすればデータベースをcreateできるのでしょうか? 非推奨のようですがmysql_create_dbを使ってたところ画面が真っ白になってしまいました。

    • 締切済み
    • PHP
  • mysqlデータベースリストア

    MySQL初心者です。 基本的な質問ですが、教えてください。 MYSQLデータベースのバックアップは、コマンドラインからmysqldumpでバックアップを行うと思います。 CMD>mysqldump -u(ユーザーグループ) -p(パスワード) (データベース名) > (バックアップファイル名).sql バックアップSQLを使って再度リストアで入れなおす場合は、 drop database (データベース名);と create database (データベース名); を実行してから行う必要があるのでしょうか? (バックアップファイル名).sqlの中身を見てみると、 CREATE TABLE '(テーブル名)' (・・・・ ・・・)の前に DROP TABLE IF EXISTS '(テーブル名)'; のようにテーブルのdropをしてからの処理はあるのですが。

    • ベストアンサー
    • MySQL