sql >> データベース >  >> RDS >> Sqlserver

SQL_Latin1_General_CP1_CI_AS を UTF-8 にエンコードする

    私はそれを解決する方法を見つけたので、これが誰かに役立つことを願っています.

    まず、SQL_Latin1_General_CP1_CI_AS は CP-1252 と UTF-8 の奇妙な組み合わせです。基本的な文字は CP-1252 であるため、UTF-8 だけですべてが機能しました。アジアおよびその他の UTF-8 文字は 2 バイトでエンコードされ、php pdo_mssql ドライバーは可変長文字を嫌うように見えるため、(nvarchar の代わりに) varchar に CAST を実行し、2 バイト文字はすべて疑問符 (' ?').

    バイナリにキャストして修正し、php でテキストを再構築しました:

    SELECT CAST(MY_COLUMN AS VARBINARY(MAX)) FROM MY_TABLE;
      

    PHP で:

    //Binary to hexadecimal
    $hex = bin2hex($bin);
    
    //And then from hex to string
    $str = "";
    for ($i=0;$i<strlen($hex) -1;$i+=2)
    {
        $str .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    //And then from UCS-2LE/SQL_Latin1_General_CP1_CI_AS (that's the column format in the DB) to UTF-8
    $str = iconv('UCS-2LE', 'UTF-8', $str);
      

    1. 一度に1行をコピーせずにMYSQLでテーブルを複製する

    2. SQLServerインデックス使用統計

    3. SQLiteでユリウス日を返す2つの方法

    4. ActiveRecordクエリにすべてのIDを含める