2023年1月18日水曜日

prismaで接続文字列に記号が入っていた場合の対策

 


知り合いに、ORマッパーとして「prisma」というものがあるということで勉強中。


Node.js TypeScript などで使用される、ということで、今後注目のORM。


自分の環境にあるのがMySQLなので、MySQLに接続しようということで


接続文字列の書き方を こちら を参考に作成。


MySQLのほかのDBの接続文字列もまとまっていてわかりやすいですね。


ただ、MySQLの場合ですが、私の環境だと、ユーザのパスワードに @ が入っています。

(たとえば p@ssword)

MySQへの接続文字列が

url = "mysql://janedoe:mypassword@localhost:3306/mydb"


ということだったのですが、そのまま書くと


url = "mysql://janedoe:p@ssword@localhost:3306/mydb"


どこまでがパスワードで、どこからが接続先なのかがわからない!

最初はシングルクォーテーションで囲ってみました。

url = "mysql://janedoe:'p@ssword'@localhost:3306/mydb"

でもダメ。

ユーザごと囲うか?

url = "mysql://'janedoe:p@ssword'@localhost:3306/mydb"

これもダメ。

どうしたものかと思案していたところ、「Example」のすぐ上にありましたね。解決策が。

Special characters
For MySQL, PostgreSQL and CockroachDB you must percentage-encode special characters in any part of your connection URL - including passwords. For example, p@$$w0rd becomes p%40%24%24w0rd.
@→%40
$→%24

ですね。
その他の文字の詳しい対応が、こちら にありました。

でも何の変換だろう。。。

パーセントエンコーディング?聞いたことないな、、、URLエンコーディングなら聞いたことあるが、、、

調べてみると、ほぼ
 URLエンコーディング = パーセントエンコーディング
として認識されている模様。ただ、半角スペースの場合

 URLエンコーディング → +
 パーセントエンコーディング → %20

と、変換方法が違う。これが「パーセント」たる所以か。

ちなみに今回の例を、パーセントエンコーディングで変換すると

url = "mysql://'janedoe:p%20ssword'@localhost:3306/mydb"

となります。

いい勉強になったな。。。