質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

4回答

1952閲覧

MySQLのみを使ってフィールドに入ってるデータに1文字ごとに半角スペースを挿入したい

haln

総合スコア13

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2018/10/02 19:50

編集2018/10/06 12:53

前提・実現したいこと

Eclipse上でPHPとMySQLを使って勉強しています。
MySQLのみを使ってフィールドに入ってる本のタイトル1文字ごとに半角スペースを挿入したいです。
PHPで1文字ごとに半角スペースを挿入する方法はできたのですが、ふと敢えてMySQL上で半角スペースを挿入する方法はないかと考えました。

調べてみたところ、MySQL上では恐らく印がないデータに対して半角スペースを挿入する方法はないらしく(例えば、「星_の_王_子_さ_ま」というデータだったならば、_を半角スペースに変更すればできる)、ストアドプロシージャなるものを使えばよいとも書いてあったのですが、具体的にどうすればよいものかが分からなく、当問題とは関係ないストアドプロシージャのサンプルをローカル環境で実行し、改変も加え基本は抑えたつもりなのですが……半角を加えるという動作をどう行えばよいのか。
teratailは答えを教えてくれるサイトではありませんので、何かヒントを教えていただけたらと思い質問に至りました。
万が一、私の調査不足で、ストアドプロシージャなしで関数のみで作れるのならば、そちらの方を教えていただけると嬉しい限りです。

該当のソースコード

このテーブルのfoo_nameが、ストアドプロシージャを通して
イメージ説明
下記のようになりたい。
イメージ説明

試したこと

5,6時間の調査

補足情報(FW/ツールのバージョンなど)

a5:sql mk-2 ver2.13.2(x64)
Eclipse Version: 2.2.200.v20180611-0500
XAMPP

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

すでに他の方も指摘されていますが、表示上の理由であれば半角空白を埋め込むのは愚の骨頂です。
Webであれば表示時のレイアウトは CSS で制御するのが筋ですし、それ以外であっても受け取った側で加工するのが本筋です。

なにより、データに空白を入れてしまうと、仮にそのデータを検索しようとしたときに常に半角空白を入れてやらねば(例えば「青空」を含む文字列を検索したい場合でも、「青 空」としなければならなくなり、可読性も利便性も損ねます。

投稿2018/10/03 01:24

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haln

2018/10/06 12:25

愚の骨頂である理由を初学者の私でも理解できるようにコメントしていただきありがとうございます。 そうですね……SQLでわざわざストアドをつくる有用性が見当たらないです。
guest

0

筋が悪い。
表示上の問題なら、マージンを調節するとかそれだけで済むし、トークンに分けたいならそれなりの方法があるかと思います。
あえてデータベース上のデータを汚染するだけの理由があるのでしょうか?

投稿2018/10/03 00:45

yoorwm

総合スコア1305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haln

2018/10/06 12:28

回答ありがとうございます。 厳しいコメントでありますが、勉強になりました。 データを汚染する理由は何もないです。 好奇心でしたが他の方から有用性がないことを教えていただけたので、PHP側で処理することにします。
guest

0

MySQLのストアドファンクションは使ったことがないので、概要だけですが、

ストアドプロシージャではなくストアドファンクション にfoo_name を渡し、
ストアドファンクションの中でfoo_name の桁数分 LOOP し、LOOPの中でSUBSTRING で1文字毎に空白を挟む。
その結果をRETURN したfoo_name を使う。

投稿2018/10/02 21:36

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haln

2018/10/06 12:30

回答ありがとうございます。 これを元にストアドを作っていきます。
guest

0

ベストアンサー

何事もやってみることは悪いことではない。
ただ文字列出力処理はsql側にあまり期待しないほうがいい。
一応以下でできるので参考にしてください

  • 2文字以上の文字を挟み込めるようにしてあります
  • 文字列の溢れはチェックしていません。
  • 最初からスペースがある場合スペースをスペースで囲むのか?など仕様を詰める必要があります

function作成

SQL

1drop function if exists myreplace; 2delimiter // 3create function myreplace(oldstr varchar(255), addstr varchar(20)) returns varchar(255) DETERMINISTIC 4begin 5DECLARE newstr varchar(255) DEFAULT ''; 6DECLARE x INT DEFAULT 0; 7DECLARE i INT DEFAULT 1; 8set x=char_length(oldstr); 9while i<=x 10do 11if i>1 then 12set newstr=concat(newstr,addstr); 13end if; 14set newstr=concat(newstr,mid(oldstr,i,1)); 15set i=i+1; 16end while; 17return newstr; 18end 19// 20delimiter ;

実行

SQL

1select myreplace('あいう','abc'); 2/* 出力:あabcいabcう */

テーブルを使った例

SQL

1create table tbl(no int,name varchar(255)); 2insert into tbl values(1,'ドン・キホーテ'),(2,'二都物語'),(3,'アルケミスト-旅をした少年'),(4,'ホビットの冒険'); 3select no,myreplace(name,'_') as new_name from tbl;

投稿2018/10/03 01:30

編集2018/10/03 01:32
yambejp

総合スコア114761

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2018/10/03 01:39

ちなみに 「teratailは答えを教えてくれるサイトではありませんので」とありますが、 以前オフ会でアンケートしたところ「ヒントはいらないのでむしろ答えを教えてくれ」 と言われて、以降回答の際には結果をコミットするよう心がけています
haln

2018/10/06 12:24

わざわざ答えまで載せていただき、ありがとうございます。 しかも空白以外も指定できる拡張っぷり……。 答えのコードを見て、勉強させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問