ProjectNami で Unicode 文字列を扱う

  • 1
    いいね
  • 0
    コメント

Azure SQL Database/SQL Server で WordPress を動作させるソリューションに ProjectNami があります。

標準の状態で日本語を扱うには、サーバーの照合順序を Japanese_CI_AS にする必要があります。
しかし、この状態ですと、cp932 の文字集合の範囲外の文字列は文字化けしてしまいます。

スマートフォンでよく使用される絵文字が文字化けしてしまうため、巷では、寿司ビール問題 と呼ばれています。これ防ぐには、 Nプレフィックスを付与する 必要があります。

以下のような修正で、 UTF-8 でのデータベース接続が有効になり、照合順序を SQL_Latin1_General_CP1_CI_AS としても文字化けせずに投稿できます。
もちろん、絵文字など、特殊な文字列の使用も可能です。

utf-8.patch
diff --git a/wp-config.php b/wp-config.php
index a1a9449..7382888 100644
--- a/wp-config.php
+++ b/wp-config.php
@@ -36,7 +36,8 @@ define('DB_HOST', ( getenv('ProjectNami.DBHost') ? getenv('ProjectNami.DBHost')
 define('DB_CHARSET', 'utf8');

 /** The Database Collate type. Don't change this if in doubt. */
-define('DB_COLLATE', '');
+define('DB_COLLATE', 'SQL_Latin1_General_CP1_CI_AS');
+putenv('ProjectNami.UTF8=1');

 /**#@+
  * Authentication Unique Keys and Salts.
diff --git a/wp-includes/wp-db.php b/wp-includes/wp-db.php
index 409d4a8..afa56ff 100644
--- a/wp-includes/wp-db.php
+++ b/wp-includes/wp-db.php
@@ -1290,7 +1290,7 @@ class wpdb {
                $query = str_replace( "'%s'", '%s', $query ); // in case someone mistakenly already singlequoted it
                $query = str_replace( '"%s"', '%s', $query ); // doublequote unquoting
                $query = preg_replace( '|(?<!%)%f|' , '%F', $query ); // Force floats to be locale unaware
-               $query = preg_replace( '|(?<!%)%s|', "'%s'", $query ); // quote the strings, avoiding escaped strings like %%s
+               $query = preg_replace( '|(?<!%)%s|', "N'%s'", $query ); // quote the strings, avoiding escaped strings like %%s
                array_walk( $args, array( $this, 'escape_by_ref' ) );
                return @vsprintf( $query, $args );
        }

See Also