代码之家  ›  专栏  ›  技术社区  ›  Rober.Ya

php作为数据库字符集插入到sql拉丁通用cp1 ciu中

  •  0
  • Rober.Ya  · 技术社区  · 6 年前

    我有一个SQL数据库,使用SQL Latin1_General_CP1_Ci_作为排序规则。
    数据库将包含大约3种语言(英语、土耳其语、阿拉伯语)。

    在主页面上,我将字符集设置为utf-8:

    header('Content-Type: text/html; charset=UTF-8');
    <meta charset="utf-8">
    

    我在php页面中使用了以下代码:

    $sql_server = "server";
    $sql_user = "user";
    $sql_password = "password";
    $sql_database = "database";
    $sql_conn_string = 'Driver={SQL Server};Server='.$sql_server.';Database='.$sql_database.';';
    if ($sql_conn = odbc_connect($sql_conn_string, $sql_user, $sql_password)){
        echo 'Connected';
        $name = $_POST['cust_name'];
        if (odbc_exec($sql_conn,"INSERT INTO inv01 (cust) VALUES (N'".$name."')")){
            echo 'is inserted';
        }
        else{
            echo 'is not inserted';
        }
        odbc_close($sql_conn);
    }
    else{
        echo 'Connection Error';
    }
    

    当我输入一个英语单词时没有问题
    但是当我使用其他语言时,这些词被作为不清楚的字符插入

    我试着用iconv但没用

    $name = iconv("UTF_8","Windows-1252",$name);
    //and
    $name = iconv("UTF_8","UCS-2LE",$name);
    

    如果SQL Latin1_General_CP1_Ci_as不是,那么在我的情况下,什么是最好的排序,还有没有其他不更改排序的解决方案

    我希望我的问题不要重复,因为我在这里读了很多问题,但没有找到正确的答案。

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Zhorov    6 年前

    你可以试试这个:

    • 确保您的“cust”列是nvarchar()。

    • 用utf-8编码html和php文件(这一步我通常使用notepad++)。

    • 转换输入数据。

    代码(基于您的示例):

    <html>
    <head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <meta charset="utf-8">
    <?php
        ...
        $name = $_POST['cust_name'];
        $name = iconv('UTF-8', 'UTF-16LE', $name);
        $name = bin2hex($name);
        $sql  = "INSERT INTO inv01 (cust) VALUES (CONVERT(nvarchar(MAX), 0x".$value."))";
        ...
    ?>
    </head>
    <body></body>
    </html>