char dan varchar (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)Titik akhir analitik SQL di Microsoft FabricWarehouse di Microsoft Fabric

Jenis data karakter yang berukuran tetap, karakter, atau ukuran variabel, varchar. Dimulai dengan SQL Server 2019 (15.x), ketika kolase yang diaktifkan UTF-8 digunakan, jenis data ini menyimpan berbagai data karakter Unicode dan menggunakan pengodean karakter UTF-8 . Jika kolase non-UTF-8 ditentukan, maka jenis data ini hanya menyimpan subkumpulan karakter yang didukung oleh halaman kode yang sesuai dari kolase tersebut.

Argumen

char [ ( n ) ]

Data string ukuran tetap. n mendefinisikan ukuran string dalam byte dan harus berupa nilai dari 1 hingga 8.000. Untuk kumpulan karakter pengodean byte tunggal seperti Latin, ukuran penyimpanan adalah n byte dan jumlah karakter yang dapat disimpan juga n. Untuk kumpulan karakter pengodean multibyte, ukuran penyimpanan masih n byte tetapi jumlah karakter yang dapat disimpan mungkin lebih kecil dari n. Sinonim ISO untuk karakter adalah karakter. Untuk informasi selengkapnya tentang kumpulan karakter, lihat Kumpulan Karakter Byte Tunggal dan Multibyte.

varchar [ ( n | maks ) ]

Data string ukuran variabel. Gunakan n untuk menentukan ukuran string dalam byte dan dapat berupa nilai dari 1 hingga 8.000, atau gunakan maks untuk menunjukkan ukuran batasan kolom hingga penyimpanan maksimum 2^31-1 byte (2 GB). Untuk kumpulan karakter pengodean byte tunggal seperti Latin, ukuran penyimpanan adalah n byte + 2 byte dan jumlah karakter yang dapat disimpan juga n. Untuk kumpulan karakter pengodean multibyte, ukuran penyimpanan masih n byte + 2 byte tetapi jumlah karakter yang dapat disimpan mungkin lebih kecil dari n. Sinonim ISO untuk varchar bervariasi karakter atau bervariasi. Untuk informasi selengkapnya tentang kumpulan karakter, lihat Kumpulan Karakter Byte Tunggal dan Multibyte.

Keterangan

Kesalahpahaman umum adalah berpikir bahwa dengan char(n) dan varchar(n), n menentukan jumlah karakter. Namun, dalam char(n) dan varchar(n), n menentukan panjang string dalam byte (0 hingga 8.000). n tidak pernah mendefinisikan jumlah karakter yang dapat disimpan. Ini mirip dengan definisi nchar(n) dan nvarchar(n).

Kesalahpahaman terjadi karena saat menggunakan pengodean byte tunggal, ukuran penyimpanan karakter dan varchar adalah n byte dan jumlah karakter juga n. Namun, untuk pengodean multibyte seperti UTF-8, rentang Unicode yang lebih tinggi (128 hingga 1.114.111) menghasilkan satu karakter menggunakan dua byte atau lebih. Misalnya, dalam kolom yang didefinisikan sebagai karakter(10), Mesin Database dapat menyimpan 10 karakter yang menggunakan pengodean byte tunggal (rentang Unicode 0 hingga 127), tetapi kurang dari 10 karakter saat menggunakan pengodean multibyte (rentang Unicode 128 hingga 1.114.111). Untuk informasi selengkapnya tentang penyimpanan Unicode dan rentang karakter, lihat Perbedaan penyimpanan antara UTF-8 dan UTF-16.

Ketika n tidak ditentukan dalam definisi data atau pernyataan deklarasi variabel, panjang defaultnya adalah 1. Jika n tidak ditentukan saat menggunakan CAST fungsi dan CONVERT , panjang defaultnya adalah 30.

Objek yang menggunakan karakter atau varchar diberi kolase default database, kecuali jika kolase tertentu ditetapkan menggunakan COLLATE klausa. Kolater mengontrol halaman kode yang digunakan untuk menyimpan data karakter.

Pengodean multibyte di SQL Server meliputi:

  • Kumpulan karakter byte ganda (DBCS) untuk beberapa bahasa Asia Timur menggunakan halaman kode 936 dan 950 (Tionghoa), 932 (Jepang), atau 949 (Korea).

  • UTF-8 dengan halaman kode 65001.

    Berlaku untuk: SQL Server 2019 (15.x) dan versi yang lebih baru.

Jika Anda memiliki situs yang mendukung beberapa bahasa:

  • Dimulai dengan SQL Server 2019 (15.x), pertimbangkan untuk menggunakan kolase berkemampuan UTF-8 untuk mendukung Unicode dan meminimalkan masalah konversi karakter.
  • Jika menggunakan versi Mesin Database SQL Server sebelumnya, pertimbangkan untuk menggunakan jenis data Unicode nchar atau nvarchar untuk meminimalkan masalah konversi karakter.

Jika Anda menggunakan char atau varchar, kami sarankan Anda:

  • Gunakan karakter saat ukuran entri data kolom konsisten.
  • Gunakan varchar saat ukuran entri data kolom sangat bervariasi.
  • Gunakan varchar(max) ketika ukuran entri data kolom sangat bervariasi, dan panjang string mungkin melebihi 8.000 byte.

Jika SET ANSI_PADDING adalah OFF ketika atau CREATE TABLEALTER TABLE dijalankan, kolom karakter yang didefinisikan sebagai NULL ditangani sebagai varchar.

Peringatan

Setiap kolom varchar(maks) atau nvarchar(maks) non-null memerlukan 24 byte alokasi tetap tambahan, yang dihitung terhadap batas baris byte 8.060 selama operasi pengurutan. Ini dapat membuat batas implisit untuk jumlah kolom non-null varchar(max) atau nvarchar(max) yang dapat dibuat dalam tabel.

Tidak ada kesalahan khusus yang diberikan ketika tabel dibuat (di luar peringatan biasa bahwa ukuran baris maksimum melebihi maksimum 8.060 byte yang diizinkan) atau pada saat penyisipan data. Ukuran baris besar ini dapat menyebabkan kesalahan (seperti kesalahan 512) selama beberapa operasi normal, seperti pembaruan kunci indeks berkluster, atau semacam kumpulan kolom lengkap, yang hanya akan terjadi saat melakukan operasi.

Mengonversi data karakter

Saat ekspresi karakter dikonversi ke tipe data karakter dengan ukuran yang berbeda, nilai yang terlalu panjang untuk jenis data baru dipotong. Jenis pengidentifikasi unik dianggap sebagai jenis karakter untuk tujuan konversi dari ekspresi karakter, sehingga tunduk pada aturan pemotongan untuk mengonversi ke jenis karakter. Lihat bagian Contoh .

Saat ekspresi karakter dikonversi ke ekspresi karakter dari jenis atau ukuran data yang berbeda, seperti dari char(5) ke varchar(5), atau char(20) ke char(15), kolase nilai input ditetapkan ke nilai yang dikonversi. Jika ekspresi noncharacter dikonversi ke jenis data karakter, kolase default database saat ini ditetapkan ke nilai yang dikonversi. Dalam kedua kasus tersebut, Anda dapat menetapkan kolate tertentu dengan menggunakan klausul COLLATE .

Catatan

Terjemahan halaman kode didukung untuk jenis data karakter dan varchar , tetapi tidak untuk jenis data teks . Seperti versi SQL Server sebelumnya, kehilangan data selama terjemahan halaman kode tidak dilaporkan.

Ekspresi karakter yang sedang dikonversi ke perkiraan jenis data numerik dapat menyertakan notasi eksponensial opsional. Notasi ini adalah huruf e kecil atau huruf E besar diikuti dengan tanda plus opsional (+) atau minus (-) lalu angka.

Ekspresi karakter yang sedang dikonversi ke jenis data numerik yang tepat harus terdiri dari digit, titik desimal, dan plus opsional (+) atau minus (-). Kosong di depan diabaikan. Pemisah koma, seperti pemisah ribuan di 123,456.00, tidak diizinkan dalam string.

Ekspresi karakter yang dikonversi menjadi jenis data uang atau smallmoney juga dapat menyertakan poin desimal opsional dan tanda dolar ($). Pemisah koma, seperti dalam $123,456.00, diizinkan.

Ketika string kosong dikonversi ke int, nilainya menjadi 0. Ketika string kosong dikonversi ke tanggal, nilainya menjadi nilai default untuk tanggal - yaitu 1900-01-01.

Contoh

J. Perlihatkan nilai default n saat digunakan dalam deklarasi variabel

Contoh berikut menunjukkan nilai default n adalah 1 untuk jenis data karakter dan varchar saat digunakan dalam deklarasi variabel.

DECLARE @myVariable AS VARCHAR = 'abc';
DECLARE @myNextVariable AS CHAR = 'abc';
--The following returns 1
SELECT DATALENGTH(@myVariable), DATALENGTH(@myNextVariable);
GO

B. Perlihatkan nilai default n saat varchar digunakan dengan CAST dan CONVERT

Contoh berikut menunjukkan bahwa nilai default n adalah 30 ketika jenis data karakter atau varchar digunakan dengan CAST fungsi dan CONVERT .

DECLARE @myVariable AS VARCHAR(40);
SET @myVariable = 'This string is longer than thirty characters';
SELECT CAST(@myVariable AS VARCHAR);
SELECT DATALENGTH(CAST(@myVariable AS VARCHAR)) AS 'VarcharDefaultLength';
SELECT CONVERT(CHAR, @myVariable);
SELECT DATALENGTH(CONVERT(CHAR, @myVariable)) AS 'VarcharDefaultLength';

C. Mengonversi data untuk tujuan tampilan

Contoh berikut mengonversi dua kolom menjadi jenis karakter dan menerapkan gaya yang menerapkan format tertentu ke data yang ditampilkan. Jenis uang dikonversi ke data karakter dan gaya 1 diterapkan, yang menampilkan nilai dengan koma setiap tiga digit di sebelah kiri titik desimal, dan dua digit di sebelah kanan titik desimal. Jenis tanggalwaktu dikonversi ke data karakter dan gaya 3 diterapkan, yang menampilkan data dalam format dd/mm/yy. WHERE Dalam klausa, jenis uang dilemparkan ke jenis karakter untuk melakukan operasi perbandingan string.

USE AdventureWorks2022;
GO
SELECT BusinessEntityID,
   SalesYTD,
   CONVERT (VARCHAR(12),SalesYTD,1) AS MoneyDisplayStyle1,
   GETDATE() AS CurrentDate,
   CONVERT(VARCHAR(12), GETDATE(), 3) AS DateDisplayStyle3
FROM Sales.SalesPerson
WHERE CAST(SalesYTD AS VARCHAR(20) ) LIKE '1%';

Berikut adalah hasil yang ditetapkan.

BusinessEntityID SalesYTD              DisplayFormat CurrentDate             DisplayDateFormat
---------------- --------------------- ------------- ----------------------- -----------------
278              1453719.4653          1,453,719.47  2011-05-07 14:29:01.193 07/05/11
280              1352577.1325          1,352,577.13  2011-05-07 14:29:01.193 07/05/11
283              1573012.9383          1,573,012.94  2011-05-07 14:29:01.193 07/05/11
284              1576562.1966          1,576,562.20  2011-05-07 14:29:01.193 07/05/11
285              172524.4512           172,524.45    2011-05-07 14:29:01.193 07/05/11
286              1421810.9242          1,421,810.92  2011-05-07 14:29:01.193 07/05/11
288              1827066.7118          1,827,066.71  2011-05-07 14:29:01.193 07/05/11

D. Mengonversi data pengidentifikasi unik

Contoh berikut mengonversi nilai pengidentifikasi unik menjadi jenis data karakter .

DECLARE @myid uniqueidentifier = NEWID();
SELECT CONVERT(CHAR(255), @myid) AS 'char';

Contoh berikut menunjukkan pemotongan data ketika nilai terlalu panjang untuk jenis data yang dikonversi. Karena jenis uniqueidentifier dibatasi hingga 36 karakter, karakter yang melebihi panjang tersebut dipotong.

DECLARE @ID NVARCHAR(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue;

Berikut adalah hasil yang ditetapkan.

String                                       TruncatedValue
-------------------------------------------- ------------------------------------
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong    0E984725-C51C-4BF4-9960-E1C80E27ABA0

(1 row(s) affected)

Lihat juga