char dan varchar (Transact-SQL)

Berlaku untuk:yes SQL Server (semua versi yang didukung) YesAzure SQL Database YesAzure SQL Managed Instance yesAzure Synapse Analytics yesAnalytics Platform System (PDW)

Jenis data karakter yang berukuran tetap, karakter, atau ukuran variabel, varchar. Dimulai dengan SQL Server 2019 (15.x), ketika kolase berkemampuan 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 penyimpanannya 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 [ ( nmax | ) ] 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 penyimpanannya adalah n byte + 2 byte dan jumlah karakter yang dapat disimpan juga n. Untuk kumpulan karakter pengodean multi-byte, ukuran penyimpanan masih n byte + 2 byte tetapi jumlah karakter yang dapat disimpan mungkin lebih kecil dari n. Sinonim ISO untuk varchar adalah charvarying atau charactervarying. Untuk informasi selengkapnya tentang kumpulan karakter, lihat Kumpulan Karakter Byte Tunggal dan Multibyte.

Keterangan

Kesalahpahaman umum adalah berpikir bahwa CHAR(n) dan VARCHAR(n), n menentukan jumlah karakter. Tetapi dalam CHAR(n) dan VARCHAR(n)n mendefinisikan panjang string dalam byte (0-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 CHAR dan VARCHAR adalah n byte dan jumlah karakter juga n. Namun, untuk pengodean multi-byte seperti UTF-8, rentang Unicode yang lebih tinggi (128-1.114.111) menghasilkan satu karakter menggunakan dua byte atau lebih. Misalnya, dalam kolom yang didefinisikan sebagai CHAR(10), Mesin Database dapat menyimpan 10 karakter yang menggunakan pengodean byte tunggal (rentang Unicode 0-127), tetapi kurang dari 10 karakter saat menggunakan pengodean multi-byte (rentang Unicode 128-1.114.111). Untuk informasi selengkapnya tentang penyimpanan Unicode dan rentang karakter, lihat Storage perbedaan 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 fungsi CAST dan CONVERT, panjang defaultnya adalah 30.

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

Pengodean multibyte dalam 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 (Dimulai dengan SQL Server 2019 (15.x)))

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 yang lebih rendah, pertimbangkan untuk menggunakan jenis data Unicode nchar atau nvarchar untuk meminimalkan masalah konversi karakter.

Jika Anda menggunakan char atau varchar, kami sarankan untuk:

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

Jika SET ANSI_PADDING NONAKTIF saat CREATE TABLE atau ALTER 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 8.060 byte 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 disediakan 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 pengurutan kumpulan kolom lengkap, yang hanya akan terjadi saat melakukan operasi.

Mengonversi Data Karakter

Saat ekspresi karakter dikonversi ke jenis data karakter dengan ukuran yang berbeda, nilai yang terlalu panjang untuk jenis data baru dipotok. Jenis pengidentifikasi unik dianggap sebagai jenis karakter untuk tujuan konversi dari ekspresi karakter, dan begitu juga tunduk pada aturan pemotokan untuk mengonversi ke jenis karakter. Lihat bagian Contoh yang berikut ini.

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, Anda dapat menetapkan kolajeasi tertentu dengan menggunakan klausa COLLATE .

Catatan

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

Ekspresi karakter yang sedang dikonversi menjadi perkiraan jenis data numerik dapat menyertakan notasi eksponensial opsional. Notasi ini adalah huruf kecil e atau huruf besar E 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 menjadi int, nilainya menjadi 0. Ketika string kosong dikonversi ke tanggal, nilainya menjadi nilai default untuk tanggal - yaitu 1900-01-01.

Contoh

A. Menampilkan nilai default n saat digunakan dalam deklarasi variabel

Contoh berikut menunjukkan nilai default n adalah 1 untuk char jenis data 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. Memperlihatkan nilai default n saat varchar digunakan dengan CAST dan CONVERT

Contoh berikut menunjukkan bahwa nilai default n adalah 30 saat char jenis data 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 koma desimal, dan dua digit di sebelah kanan koma. Jenis tanggalwaktu dikonversi ke data karakter dan gaya 3 diterapkan, yang menampilkan data dalam format dd/mm/yy. Dalam klausa WHERE, jenis uang ditransmisikan ke jenis karakter untuk melakukan operasi perbandingan string.

USE AdventureWorks2012;
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 uniqueidentifier nilai menjadi char jenis data.

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

Contoh berikut menunjukkan pemotokan data ketika nilai terlalu panjang untuk jenis data yang dikonversi. Karena jenis pengidentifikasi unik dibatasi hingga 36 karakter, karakter yang melebihi panjang tersebut dipotok.

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

nchar dan nvarchar (Transact-SQL)

CAST dan CONVERT (transact-SQL)

COLLATE (Transact-SQL)

Konversi Tipe Data (Mesin Database)

Jenis Data (SQL Bertransaksi)

Memperkirakan Ukuran Database

Kolajeasi dan Dukungan Unicode

Kumpulan Karakter Byte Tunggal dan Multibyte