1

MSSQL データベースを作成しました。照合順序は SQL_Latin1_General_CP1_CS_AS です。freetds を使用して Linux-Apache-PHP サーバーから使用します。Web フォームからテキストを受け取り、特殊文字 (カフェなど) を含むテキストを挿入しようとすると、エラーが発生します。

<?php
ini_set('display_errors', '1') ;
$MyConn = mssql_connect( "MSPROD", "one", "1a!logas1" ) ;
mssql_select_db( "SIAM", $MyConn ) ;
if ( isset( $_GET['arg'] ) )
    {
    $arg = $_GET['arg'] ;
    print "Inserting '$arg'<br>\n" ;
    for ( $i = 0 ; $i < strlen( $arg ) ; $i ++ )
        {
        print dechex( ord( $arg{$i} ) ) . ' ' ;
        }
    mssql_query( "INSERT mytest VALUES('$arg')" ) ;
    }
?>
<form action=badchars.php method=get>
<input type=text name=arg>
</form>

これはエラーです:

'café' を挿入しています 63 61 66 e9 警告: mssql_query(): Sybase: サーバー メッセージ: 文字列 'caf' の後の引用符が閉じていません。(重大度 15、手順 N/A) /www/one/mytest/badchars.php の 13 行目 警告: mssql_query(): Sybase: サーバー メッセージ: 'caf' 付近の構文が正しくありません。(重大度 15、手順 N/A) /www/one/mytest/badchars.php の 13 行目

Sybase に言及しているのは、サーバーが最初にインストールされたためですが、Sybase と Msql の機能は同一であることを理解しているため、問題にはなりません。テキストを引用符で囲もうとすると、同じエラーが発生します。

mssql_query( "INSERT mytest VALUES('café')" ) ;

しかし、SQL Server Manager で同じクエリを実行すると、うまくいきます。これは機能します:

mssql_query( "INSERT mytest VALUES('caf' + char(233) )" ) ;

私は何を間違っていますか?

4

1 に答える 1

0

php_mssql の使用を中止することを強くお勧めします。代わりに、php_mssql でMicrosoft Drivers for PHP for SQL Server発生するほとんどすべての問題が解決されます。php_mssql を使用して SQL Server との間で UTF-8 データを送受信する際に多くの問題が発生します。

php_mssql は古い SQL Server ドライバーしかサポートしていないため、Text と Varchar を選択するときに nText と nVarchar をキャストする必要があります ...

本当に php_mssql を使用する必要がある場合はiconv、おそらく andを使用する必要がありますutf8_decode。SQL Server で UTF-8 ペルシャ語/アラビア語データを保存および取得するために作成した 2 つの関数を次に示します。

function persian_sql_to_php($str){
    if(mb_detect_encoding($str) == 'UTF-8' AND mb_check_encoding($str, 'UTF-8')){
        $str = utf8_decode($str);
    }
    $str = iconv('Windows-1256', 'UTF-8', $str);
    return $str;
}

function persian_php_to_sql($str){
    $str = iconv('UTF-8', 'Windows-1256', $str);
    return $str;
}

使用している言語に応じて、Windows-1256 を別のものに変更する必要があります。またutf8_decodeutf8_encode単独で試してみてください。おそらく、それらはあなたのケースでうまくいくでしょう。

アップデート:

FreeTDSを使用しているため、UTF-8の問題について上で説明したメインのphp_mssqlとは状況が少し異なる場合があります...

更新 2: Windows でこのコードを試したところ、うまくいくようです。あなたも試してみてください。

<?php

mssql_connect('127.0.0.1', 'sa', '123456');
mssql_select_db('test');

$val = 'café';

$val = iconv('UTF-8', 'ISO-8859-1', $val);

mssql_query('INSERT INTO mytest (test) VALUES (\''.$val.'\');');

?>
于 2012-09-17T15:23:54.957 に答える