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

SQL Server は ??? を返します列がタイ文字で更新されたとき

    質問で提供される情報は多くありません。私たちが知っているのは:

    • 列は Thai_CI_AS の照合を使用しています (少なくとも、質問が述べているように聞こえます)
    • タイ文字が渡されています
    • 列に格納されるのは次のとおりです:???

    ただし、それだけで次の 2 つのことが推測できます。

    <オール> <リ>

    着信文字列は NVARCHAR でもありません パラメータ/変数、または大文字の「N」が前に付いた文字列リテラルではありません

    そして

    <リ>

    クエリが実行されている DB (必ずしもテーブルが存在する DB) のデフォルトの照合は not です タイの照合。

    宛先列が VARCHAR かどうかはわかりません または NVARCHAR 、しかし、列の照合がタイの照合であるかどうかは問題ではありません (それは VARCHAR を許可するため) タイ文字を保持するデータ、および NVARCHAR 関係なく動作します)。

    どちらかの場合 :

      <リ>

      着信文字列は NVARCHAR を使用します パラメータ (または文字列リテラルの場合は、大文字の "N" を前に付ける)、

      または

      <リ>

      クエリは、タイのデフォルトの照合を持つ DB で実行されました

    その後、タイ文字は期待どおりに保存されます。

    次の例は、この動作を示しています。 タイ語の文字コムット U+0E5B を使用しています Korean_100_CS_AS_KS_WS_SC を持つインスタンス インスタンスレベルのデフォルトの照合。宛先列には Thai_CI_AS の照合があります .まず、「現在の」DB はそうではありません タイ語のデフォルトの照合順序がある場合、この文字を 2 回追加します。1 回目は "N" のプレフィックスを付け、もう 1 回は文字列リテラルにプレフィックスを付けません:

    USE [tempdb];
    -- DROP TABLE #Thai;
    CREATE TABLE #Thai (ID INT IDENTITY(1, 1), Col1 VARCHAR(50) COLLATE Thai_CI_AS);
    
    -- In a DB with a non-Thai default Collation:
    INSERT INTO #Thai (Col1) VALUES ('๛');
    INSERT INTO #Thai (Col1) VALUES (N'๛');
    

    次に、できる DB に切り替えます タイ語のデフォルトの照合を使用し、接頭辞のない文字列のみを挿入します ("N" 接頭辞付き文字列を再テストする必要はありません):

    USE [other_db];
    
    -- In a DB with a Thai default Collation:
    INSERT INTO #Thai (Col1) VALUES ('๛');
    
    
    SELECT * FROM #Thai;
    

    結果は次のとおりです。

    ID  Col1
    1   ?
    2   ๛
    3   ๛
    

    ご覧のとおり (以下のポイント # は、上記の結果の ID # に関連しています):

    <オール>
  1. タイ語以外の既定の照合を使用する DB で使用される "N" プレフィックスのない文字列は、?
  2. タイ語以外のデフォルトの照合を使用する DB でも使用される「N」プレフィックス文字列は、値を正しく格納しました
  3. タイ語の既定の照合順序を持つ DB で使用される、"N" プレフィックスのない文字列は、値を正しく格納しました



    1. Oracle:なぜ並列実行を使用しないのですか?

    2. SQL - オペランドのデータ型 datetime2 は減算演算子には無効です

    3. スプレッドシートとデータベース:切り替える時が来ましたか?パート2

    4. 統計の更新