<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 -->
<p>Modern applications serve global audiences with diverse languages, scripts, and cultural conventions. Geode provides comprehensive Unicode support and internationalization (i18n) capabilities, enabling you to build truly global graph applications that handle multilingual content, complex scripts, and locale-specific operations with ease and correctness.</p>
<p>As an ISO/IEC 39075:2024 GQL-compliant graph database, Geode uses UTF-8 encoding throughout, supporting the full Unicode 15.0 character set including emoji, mathematical symbols, ancient scripts, and all modern languages. From right-to-left text to combining diacritical marks, Geode handles the complexities of international text processing transparently and efficiently.</p>
<h3 id="unicode-fundamentals-in-geode" class="position-relative d-flex align-items-center group">
<span>Unicode Fundamentals in Geode</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="unicode-fundamentals-in-geode"
aria-haspopup="dialog"
aria-label="Share link: Unicode Fundamentals in Geode">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
<div class="hsm-dialog" role="document">
<div class="hsm-header">
<h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2>
<button type="button" class="hsm-close" aria-label="Close">
<i class="fa-solid fa-xmark"></i>
</button>
</div>
<div class="hsm-body">
<label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label>
<div class="input-group mb-4 hsm-url-group">
<input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" />
<button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
<i class="fa-duotone fa-clipboard" aria-hidden="true"></i>
</button>
</div>
<div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div>
<div class="hsm-share-grid">
<a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-twitter me-2"></i>Twitter
</a>
<a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-linkedin me-2"></i>LinkedIn
</a>
<a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-facebook me-2"></i>Facebook
</a>
</div>
</div>
</div>
</div>
<style>
.heading-share-modal {
position: fixed;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.6);
z-index: 1050;
padding: 1rem;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.heading-share-modal[hidden] { display: none !important; }
.hsm-dialog {
max-width: 420px;
width: 100%;
background: var(--bs-body-bg, #fff);
color: var(--bs-body-color, #212529);
border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
border-radius: 1rem;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
overflow: hidden;
animation: hsm-fade-in 0.2s ease-out;
}
@keyframes hsm-fade-in {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
[data-bs-theme="dark"] .hsm-dialog {
background: #1e293b;
border-color: rgba(255,255,255,0.1);
color: #f8f9fa;
}
.hsm-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
background: rgba(0,0,0,0.02);
}
[data-bs-theme="dark"] .hsm-header {
background: rgba(255,255,255,0.02);
border-color: rgba(255,255,255,0.1);
}
.hsm-close {
background: transparent;
border: none;
color: inherit;
opacity: 0.5;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-size: 1.2rem;
line-height: 1;
transition: opacity 0.2s;
}
.hsm-close:hover {
opacity: 1;
}
.hsm-body {
padding: 1.5rem;
}
.hsm-url-group {
display: flex !important;
align-items: stretch;
}
.hsm-url-group .form-control {
flex: 1;
min-width: 0;
margin: 0;
background: var(--bs-secondary-bg, #f8f9fa);
border-color: var(--bs-border-color, #dee2e6);
border-top-right-radius: 0;
border-bottom-right-radius: 0;
height: 42px;
}
.hsm-url-group .btn {
flex: 0 0 auto;
margin: 0;
margin-left: -1px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 1.25rem;
z-index: 2;
}
[data-bs-theme="dark"] .hsm-url-group .form-control {
background: #0f172a;
border-color: #334155;
color: #e2e8f0;
}
.hsm-share-grid {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.hsm-share-grid .btn {
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
padding: 0.6rem;
border-color: var(--bs-border-color);
width: 100%;
}
[data-bs-theme="dark"] .hsm-share-grid .btn {
color: #e2e8f0;
border-color: #475569;
}
[data-bs-theme="dark"] .hsm-share-grid .btn:hover {
background: #334155;
border-color: #cbd5e1;
}
</style>
<script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest && e.target.closest('.h-share');
if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
</script><p><strong>UTF-8 Encoding</strong>: Geode stores all text using UTF-8, the universal character encoding that represents every character in the Unicode standard. UTF-8 is backward-compatible with ASCII, efficient for most languages, and widely supported across platforms and programming languages.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">All</span><span class="w"> </span><span class="py">these</span><span class="w"> </span><span class="py">characters</span><span class="w"> </span><span class="py">work</span><span class="w"> </span><span class="py">seamlessly</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name_en</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Alice</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name_ja</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">アリス</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name_ar</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">أليس</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name_ru</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Алиса</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name_zh</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">爱丽丝</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">greeting_emoji</span><span class="p">:</span><span class="w"> </span><span class="err">'👋🌍🎉'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="nc">Unicode</span><span class="w"> </span><span class="py">escapes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">t</span><span class="p">:</span><span class="nc">Text</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">content</span><span class="p">:</span><span class="w"> </span><span class="err">'\</span><span class="nc">u0048</span><span class="err">\</span><span class="py">u0065</span><span class="err">\</span><span class="py">u006C</span><span class="err">\</span><span class="py">u006C</span><span class="err">\</span><span class="py">u006F</span><span class="err">'</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="s">"Hello"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Character Properties</strong>: Geode correctly handles Unicode character properties including:</p>
<ul>
<li><strong>Case Mapping</strong>: Upper, lower, and title case transformations</li>
<li><strong>Character Categories</strong>: Letters, numbers, punctuation, symbols, separators</li>
<li><strong>Script Detection</strong>: Latin, Cyrillic, Arabic, Han, etc.</li>
<li><strong>Directionality</strong>: Left-to-right (LTR) and right-to-left (RTL) text</li>
<li><strong>Combining Characters</strong>: Diacritics, accents, and modifiers</li>
</ul>
<h3 id="multilingual-text-storage" class="position-relative d-flex align-items-center group">
<span>Multilingual Text Storage</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="multilingual-text-storage"
aria-haspopup="dialog"
aria-label="Share link: Multilingual Text Storage">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p><strong>Storing Multiple Languages</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Product</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">multilingual</span><span class="w"> </span><span class="py">descriptions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">sku</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">LAPTOP</span><span class="err">-</span><span class="py">001</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name_en</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Professional</span><span class="w"> </span><span class="py">Laptop</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name_es</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Portátil</span><span class="w"> </span><span class="py">Profesional</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name_fr</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Ordinateur</span><span class="w"> </span><span class="py">Portable</span><span class="w"> </span><span class="py">Professionnel</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name_de</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Professioneller</span><span class="w"> </span><span class="py">Laptop</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name_ja</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">プロフェッショナル</span><span class="w"> </span><span class="py">ラップトップ</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name_zh</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">专业笔记本电脑</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Content</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">mixed</span><span class="w"> </span><span class="py">scripts</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">doc</span><span class="p">:</span><span class="nc">Document</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">title</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">International</span><span class="w"> </span><span class="py">Meeting</span><span class="w"> </span><span class="py">Notes</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">content</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Discussion</span><span class="w"> </span><span class="py">about</span><span class="w"> </span><span class="py">データベース</span><span class="w"> </span><span class="p">(</span><span class="py">database</span><span class="p">)</span><span class="w"> </span><span class="py">and</span><span class="w"> </span><span class="py">قاعدة</span><span class="w"> </span><span class="py">البيانات</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Language-Specific Properties</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">language</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name_en</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name_es</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name_fr</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Dynamic</span><span class="w"> </span><span class="py">language</span><span class="w"> </span><span class="py">selection</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="py">p</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="py">es</span><span class="err">'</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">lang</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">sku</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w"> </span><span class="py">lang</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="err">'</span><span class="py">en</span><span class="err">'</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name_en</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="err">'</span><span class="py">es</span><span class="err">'</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name_es</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="err">'</span><span class="py">fr</span><span class="err">'</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name_fr</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name_en</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">END</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">localized_name</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="character-normalization" class="position-relative d-flex align-items-center group">
<span>Character Normalization</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="character-normalization"
aria-haspopup="dialog"
aria-label="Share link: Character Normalization">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Unicode defines multiple ways to represent the same character (e.g., “é” can be a single character or “e” + combining accent). Normalization ensures consistent representation:</p>
<p><strong>Normalization Forms</strong>:</p>
<ul>
<li><strong>NFC (Canonical Composition)</strong>: Combines base + modifiers into single characters</li>
<li><strong>NFD (Canonical Decomposition)</strong>: Separates characters into base + modifiers</li>
<li><strong>NFKC (Compatibility Composition)</strong>: Aggressive composition with compatibility mappings</li>
<li><strong>NFKD (Compatibility Decomposition)</strong>: Aggressive decomposition with compatibility mappings</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Normalize</span><span class="w"> </span><span class="py">text</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">NFC</span><span class="w"> </span><span class="p">(</span><span class="py">recommended</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">most</span><span class="w"> </span><span class="py">use</span><span class="w"> </span><span class="py">cases</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">NORMALIZE</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="py">NFC</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Compare</span><span class="w"> </span><span class="py">normalized</span><span class="w"> </span><span class="py">text</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">NORMALIZE</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="py">NFC</span><span class="err">'</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">NORMALIZE</span><span class="p">(</span><span class="err">'</span><span class="py">José</span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="py">NFC</span><span class="err">'</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Search</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">normalization</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">NORMALIZE</span><span class="p">(</span><span class="py">LOWER</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">),</span><span class="w"> </span><span class="err">'</span><span class="py">NFC</span><span class="err">'</span><span class="p">)</span><span class="w"> </span><span class="py">CONTAINS</span><span class="w"> </span><span class="py">NORMALIZE</span><span class="p">(</span><span class="py">LOWER</span><span class="p">(</span><span class="err">'</span><span class="py">josé</span><span class="err">'</span><span class="p">),</span><span class="w"> </span><span class="err">'</span><span class="py">NFC</span><span class="err">'</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>When to Normalize</strong>:</p>
<ul>
<li><strong>Data Ingestion</strong>: Normalize on insert to ensure consistency</li>
<li><strong>Comparison</strong>: Normalize before comparing user input with stored data</li>
<li><strong>Indexing</strong>: Create indexes on normalized values for consistent matching</li>
<li><strong>Search</strong>: Normalize search terms and content for accurate matching</li>
</ul>
<h3 id="collation-and-sorting" class="position-relative d-flex align-items-center group">
<span>Collation and Sorting</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="collation-and-sorting"
aria-haspopup="dialog"
aria-label="Share link: Collation and Sorting">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Collation determines how text is sorted and compared, respecting language-specific rules:</p>
<p><strong>Default Collation</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Default</span><span class="w"> </span><span class="py">UTF</span><span class="err">-</span><span class="py">8</span><span class="w"> </span><span class="py">binary</span><span class="w"> </span><span class="py">collation</span><span class="w"> </span><span class="p">(</span><span class="py">byte</span><span class="err">-</span><span class="py">order</span><span class="w"> </span><span class="py">sorting</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Locale-Specific Collation</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">English</span><span class="w"> </span><span class="py">collation</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="w"> </span><span class="py">COLLATE</span><span class="w"> </span><span class="err">'</span><span class="py">en_US</span><span class="err">';</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Spanish</span><span class="w"> </span><span class="py">collation</span><span class="w"> </span><span class="p">(</span><span class="py">ñ</span><span class="w"> </span><span class="py">sorted</span><span class="w"> </span><span class="py">after</span><span class="w"> </span><span class="py">n</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="w"> </span><span class="py">COLLATE</span><span class="w"> </span><span class="err">'</span><span class="py">es_ES</span><span class="err">';</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">German</span><span class="w"> </span><span class="py">collation</span><span class="w"> </span><span class="p">(</span><span class="py">ä</span><span class="p">,</span><span class="w"> </span><span class="py">ö</span><span class="p">,</span><span class="w"> </span><span class="py">ü</span><span class="w"> </span><span class="py">sorted</span><span class="w"> </span><span class="py">specifically</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="w"> </span><span class="py">COLLATE</span><span class="w"> </span><span class="err">'</span><span class="py">de_DE</span><span class="err">';</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Case</span><span class="err">-</span><span class="py">insensitive</span><span class="w"> </span><span class="py">collation</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="w"> </span><span class="py">COLLATE</span><span class="w"> </span><span class="err">'</span><span class="py">en_US_CI</span><span class="err">';</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">CI</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">Case</span><span class="w"> </span><span class="py">Insensitive</span><span class="w">
</span></span></span></code></pre></div><p><strong>Supported Locales</strong>:</p>
<p>Geode supports 100+ locales including:</p>
<ul>
<li>Western European: en_US, es_ES, fr_FR, de_DE, it_IT, pt_BR</li>
<li>Nordic: sv_SE, no_NO, da_DK, fi_FI</li>
<li>Eastern European: pl_PL, cs_CZ, ru_RU, uk_UA</li>
<li>Asian: zh_CN, ja_JP, ko_KR, th_TH, vi_VN</li>
<li>Middle Eastern: ar_SA, he_IL, fa_IR, tr_TR</li>
</ul>
<h3 id="case-conversion" class="position-relative d-flex align-items-center group">
<span>Case Conversion</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="case-conversion"
aria-haspopup="dialog"
aria-label="Share link: Case Conversion">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Unicode-aware case conversion respects language-specific rules:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Standard</span><span class="w"> </span><span class="py">case</span><span class="w"> </span><span class="py">conversion</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">UPPER</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">),</span><span class="w"> </span><span class="py">LOWER</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Locale</span><span class="err">-</span><span class="py">specific</span><span class="w"> </span><span class="py">case</span><span class="w"> </span><span class="py">conversion</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">UPPER</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="w"> </span><span class="py">COLLATE</span><span class="w"> </span><span class="err">'</span><span class="py">tr_TR</span><span class="err">'</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">turkish_upper</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Turkish</span><span class="w"> </span><span class="err">'</span><span class="py">i</span><span class="err">'</span><span class="w"> </span><span class="py">has</span><span class="w"> </span><span class="py">special</span><span class="w"> </span><span class="py">case</span><span class="w"> </span><span class="py">rules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="err">'</span><span class="nc">i</span><span class="err">'</span><span class="w"> </span><span class="err">→</span><span class="w"> </span><span class="err">'</span><span class="py">İ</span><span class="err">'</span><span class="w"> </span><span class="p">(</span><span class="py">dotted</span><span class="w"> </span><span class="py">capital</span><span class="w"> </span><span class="py">I</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="err">'</span><span class="py">ı</span><span class="err">'</span><span class="w"> </span><span class="err">→</span><span class="w"> </span><span class="err">'</span><span class="py">I</span><span class="err">'</span><span class="w"> </span><span class="p">(</span><span class="py">dotless</span><span class="w"> </span><span class="py">capital</span><span class="w"> </span><span class="py">I</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">UPPER</span><span class="p">(</span><span class="err">'</span><span class="py">istanbul</span><span class="err">'</span><span class="w"> </span><span class="py">COLLATE</span><span class="w"> </span><span class="err">'</span><span class="py">tr_TR</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="err">'</span><span class="py">İSTANBUL</span><span class="err">'</span><span class="w">
</span></span></span></code></pre></div><p><strong>Title Case</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Initialize</span><span class="w"> </span><span class="py">capitals</span><span class="w"> </span><span class="p">(</span><span class="py">title</span><span class="w"> </span><span class="py">case</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">INITCAP</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">title_case</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Example</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">alice</span><span class="w"> </span><span class="py">johnson</span><span class="err">'</span><span class="w"> </span><span class="err">→</span><span class="w"> </span><span class="err">'</span><span class="py">Alice</span><span class="w"> </span><span class="py">Johnson</span><span class="err">'</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="emoji-and-special-characters" class="position-relative d-flex align-items-center group">
<span>Emoji and Special Characters</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="emoji-and-special-characters"
aria-haspopup="dialog"
aria-label="Share link: Emoji and Special Characters">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Geode fully supports emoji and special Unicode characters:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Store</span><span class="w"> </span><span class="py">emoji</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Post</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">content</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Loving</span><span class="w"> </span><span class="py">the</span><span class="w"> </span><span class="py">new</span><span class="w"> </span><span class="py">features</span><span class="p">!</span><span class="w"> </span><span class="err">🎉🚀💯'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">reactions</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="err">'❤</span><span class="nc">️</span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'👍'</span><span class="p">,</span><span class="w"> </span><span class="err">'😂'</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Search</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">emoji</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Post</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">content</span><span class="w"> </span><span class="py">CONTAINS</span><span class="w"> </span><span class="err">'🎉'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">content</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Count</span><span class="w"> </span><span class="py">emoji</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Post</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">LENGTH</span><span class="p">(</span><span class="py">REGEXP_EXTRACT_ALL</span><span class="p">(</span><span class="py">p</span><span class="err">.</span><span class="py">content</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="p">[</span><span class="err">\</span><span class="py">u</span><span class="p">{</span><span class="py">1F600</span><span class="p">}</span><span class="err">-\</span><span class="py">u</span><span class="p">{</span><span class="py">1F64F</span><span class="p">}]</span><span class="err">'</span><span class="p">))</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">emoji_count</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Mathematical</span><span class="w"> </span><span class="py">symbols</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">eq</span><span class="p">:</span><span class="nc">Equation</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">formula</span><span class="p">:</span><span class="w"> </span><span class="err">'∫₀^∞</span><span class="w"> </span><span class="nc">e</span><span class="err">^</span><span class="p">(</span><span class="err">-</span><span class="py">x</span><span class="err">²</span><span class="p">)</span><span class="w"> </span><span class="py">dx</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">√</span><span class="py">π</span><span class="w"> </span><span class="err">/</span><span class="w"> </span><span class="py">2</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">symbols</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="err">'∫'</span><span class="p">,</span><span class="w"> </span><span class="err">'∞'</span><span class="p">,</span><span class="w"> </span><span class="err">'√'</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="nc">π</span><span class="err">'</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Surrogate Pairs</strong>: Geode correctly handles characters outside the Basic Multilingual Plane (BMP), including emoji that require surrogate pairs in UTF-16:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">These</span><span class="w"> </span><span class="py">emoji</span><span class="w"> </span><span class="py">use</span><span class="w"> </span><span class="py">4</span><span class="err">-</span><span class="py">byte</span><span class="w"> </span><span class="py">UTF</span><span class="err">-</span><span class="py">8</span><span class="w"> </span><span class="py">sequences</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Post</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">content</span><span class="p">:</span><span class="w"> </span><span class="err">'🌈🦄🎨'</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="nc">Rainbow</span><span class="p">,</span><span class="w"> </span><span class="py">unicorn</span><span class="p">,</span><span class="w"> </span><span class="py">palette</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Character</span><span class="w"> </span><span class="py">length</span><span class="w"> </span><span class="py">is</span><span class="w"> </span><span class="py">correct</span><span class="w"> </span><span class="p">(</span><span class="py">3</span><span class="w"> </span><span class="py">characters</span><span class="p">,</span><span class="w"> </span><span class="py">not</span><span class="w"> </span><span class="py">6</span><span class="w"> </span><span class="py">or</span><span class="w"> </span><span class="py">12</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Post</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">CHAR_LENGTH</span><span class="p">(</span><span class="py">p</span><span class="err">.</span><span class="py">content</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Returns</span><span class="w"> </span><span class="py">3</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="right-to-left-rtl-text" class="position-relative d-flex align-items-center group">
<span>Right-to-Left (RTL) Text</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="right-to-left-rtl-text"
aria-haspopup="dialog"
aria-label="Share link: Right-to-Left (RTL) Text">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Geode stores and retrieves RTL text (Arabic, Hebrew, etc.) correctly:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Arabic</span><span class="w"> </span><span class="py">text</span><span class="w"> </span><span class="p">(</span><span class="py">RTL</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Post</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">content_ar</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">مرحبا</span><span class="w"> </span><span class="py">بك</span><span class="w"> </span><span class="py">في</span><span class="w"> </span><span class="py">قاعدة</span><span class="w"> </span><span class="py">البيانات</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">content_he</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">ברוכים</span><span class="w"> </span><span class="py">הבאים</span><span class="w"> </span><span class="py">למסד</span><span class="w"> </span><span class="py">הנתונים</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Mixed</span><span class="w"> </span><span class="py">LTR</span><span class="err">/</span><span class="py">RTL</span><span class="w"> </span><span class="p">(</span><span class="py">bidirectional</span><span class="w"> </span><span class="py">text</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Post</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">content</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Welcome</span><span class="w"> </span><span class="py">مرحبا</span><span class="w"> </span><span class="py">שלום</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">our</span><span class="w"> </span><span class="py">database</span><span class="p">!</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">RTL</span><span class="w"> </span><span class="py">text</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Post</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">content_ar</span><span class="w"> </span><span class="py">CONTAINS</span><span class="w"> </span><span class="err">'</span><span class="py">قاعدة</span><span class="w"> </span><span class="py">البيانات</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">content_ar</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="internationalization-patterns" class="position-relative d-flex align-items-center group">
<span>Internationalization Patterns</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="internationalization-patterns"
aria-haspopup="dialog"
aria-label="Share link: Internationalization Patterns">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p><strong>Language Detection</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Store</span><span class="w"> </span><span class="py">language</span><span class="w"> </span><span class="py">metadata</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">doc</span><span class="p">:</span><span class="nc">Document</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">content</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">This</span><span class="w"> </span><span class="py">is</span><span class="w"> </span><span class="py">an</span><span class="w"> </span><span class="py">English</span><span class="w"> </span><span class="py">document</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">language</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">en</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">detected_script</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Latin</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">language</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">doc</span><span class="p">:</span><span class="nc">Document</span><span class="w"> </span><span class="p">{</span><span class="py">language</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">en</span><span class="err">'</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">doc</span><span class="err">.</span><span class="py">content</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Locale-Specific Formatting</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Store</span><span class="w"> </span><span class="py">locale</span><span class="w"> </span><span class="py">preferences</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Alice</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">locale</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">en_US</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">timezone</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">America</span><span class="err">/</span><span class="py">New_York</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">date_format</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">MM</span><span class="err">/</span><span class="py">DD</span><span class="err">/</span><span class="py">YYYY</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">number_format</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="c">#,##0.00'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="nc">Query</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">locale</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">FORMAT_DATE</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">created_at</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">date_format</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">formatted_date</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">FORMAT_NUMBER</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">balance</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">number_format</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">formatted_balance</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="full-text-search-with-multiple-languages" class="position-relative d-flex align-items-center group">
<span>Full-Text Search with Multiple Languages</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="full-text-search-with-multiple-languages"
aria-haspopup="dialog"
aria-label="Share link: Full-Text Search with Multiple Languages">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Create language-specific full-text indexes:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">English</span><span class="w"> </span><span class="py">full</span><span class="err">-</span><span class="py">text</span><span class="w"> </span><span class="py">index</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">FULLTEXT</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">content_en</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Document</span><span class="p">(</span><span class="py">content_en</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="p">(</span><span class="py">language</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">english</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Spanish</span><span class="w"> </span><span class="py">full</span><span class="err">-</span><span class="py">text</span><span class="w"> </span><span class="py">index</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">FULLTEXT</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">content_es</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Document</span><span class="p">(</span><span class="py">content_es</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="p">(</span><span class="py">language</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">spanish</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Chinese</span><span class="w"> </span><span class="py">full</span><span class="err">-</span><span class="py">text</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="p">(</span><span class="py">requires</span><span class="w"> </span><span class="py">CJK</span><span class="w"> </span><span class="py">tokenization</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">FULLTEXT</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">content_zh</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Document</span><span class="p">(</span><span class="py">content_zh</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="p">(</span><span class="py">language</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">chinese</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Multi</span><span class="err">-</span><span class="py">language</span><span class="w"> </span><span class="py">search</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">d</span><span class="p">:</span><span class="nc">Document</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">d</span><span class="err">.</span><span class="py">content_en</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">database</span><span class="err">'</span><span class="w"> </span><span class="py">OR</span><span class="w"> </span><span class="py">d</span><span class="err">.</span><span class="py">content_es</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">base</span><span class="w"> </span><span class="py">de</span><span class="w"> </span><span class="py">datos</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">d</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="character-analysis-functions" class="position-relative d-flex align-items-center group">
<span>Character Analysis Functions</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="character-analysis-functions"
aria-haspopup="dialog"
aria-label="Share link: Character Analysis Functions">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p><strong>Character Categories</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Check</span><span class="w"> </span><span class="py">character</span><span class="w"> </span><span class="kd">type</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">RETURN</span><span class="w"> </span><span class="py">IS_ALPHA</span><span class="p">(</span><span class="err">'</span><span class="py">A</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">IS_ALPHA</span><span class="p">(</span><span class="err">'</span><span class="py">5</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">IS_DIGIT</span><span class="p">(</span><span class="err">'</span><span class="py">5</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">IS_ALPHANUMERIC</span><span class="p">(</span><span class="err">'</span><span class="py">A5</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Unicode</span><span class="w"> </span><span class="py">category</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">UNICODE_CATEGORY</span><span class="p">(</span><span class="err">'</span><span class="py">A</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="err">'</span><span class="py">Lu</span><span class="err">'</span><span class="w"> </span><span class="p">(</span><span class="py">Letter</span><span class="p">,</span><span class="w"> </span><span class="py">uppercase</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">UNICODE_CATEGORY</span><span class="p">(</span><span class="err">'</span><span class="py">π</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="err">'</span><span class="py">Ll</span><span class="err">'</span><span class="w"> </span><span class="p">(</span><span class="py">Letter</span><span class="p">,</span><span class="w"> </span><span class="py">lowercase</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">UNICODE_CATEGORY</span><span class="p">(</span><span class="err">'</span><span class="py">5</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="err">'</span><span class="py">Nd</span><span class="err">'</span><span class="w"> </span><span class="p">(</span><span class="py">Number</span><span class="p">,</span><span class="w"> </span><span class="py">decimal</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">UNICODE_CATEGORY</span><span class="p">(</span><span class="err">'</span><span class="p">!</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="err">'</span><span class="py">Po</span><span class="err">'</span><span class="w"> </span><span class="p">(</span><span class="py">Punctuation</span><span class="p">,</span><span class="w"> </span><span class="py">other</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><p><strong>Script Detection</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Detect</span><span class="w"> </span><span class="py">script</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">DETECT_SCRIPT</span><span class="p">(</span><span class="err">'</span><span class="py">Hello</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="err">'</span><span class="py">Latin</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">DETECT_SCRIPT</span><span class="p">(</span><span class="err">'</span><span class="py">こんにちは</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="err">'</span><span class="py">Hiragana</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">DETECT_SCRIPT</span><span class="p">(</span><span class="err">'</span><span class="py">你好</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="err">'</span><span class="py">Han</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">DETECT_SCRIPT</span><span class="p">(</span><span class="err">'</span><span class="py">مرحبا</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="err">'</span><span class="py">Arabic</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">DETECT_SCRIPT</span><span class="p">(</span><span class="err">'</span><span class="py">Привет</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="err">'</span><span class="py">Cyrillic</span><span class="err">'</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="performance-considerations" class="position-relative d-flex align-items-center group">
<span>Performance Considerations</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="performance-considerations"
aria-haspopup="dialog"
aria-label="Share link: Performance Considerations">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p><strong>Indexing Unicode Text</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">normalized</span><span class="w"> </span><span class="py">text</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_name_normalized</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">NORMALIZE</span><span class="p">(</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="py">NFC</span><span class="err">'</span><span class="p">))</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Efficient</span><span class="w"> </span><span class="py">search</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">normalization</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">NORMALIZE</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="py">NFC</span><span class="err">'</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">NORMALIZE</span><span class="p">(</span><span class="nv">$search_term</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="py">NFC</span><span class="err">'</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Storage Efficiency</strong>:</p>
<ul>
<li>UTF-8 is most efficient for ASCII and European languages (1 byte per character)</li>
<li>Asian scripts require 3-4 bytes per character</li>
<li>Emoji and rare characters may require 4 bytes</li>
<li>Normalization can reduce storage size by combining characters</li>
</ul>
<p><strong>Query Optimization</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Inefficient</span><span class="p">:</span><span class="w"> </span><span class="nc">case</span><span class="w"> </span><span class="py">conversion</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">every</span><span class="w"> </span><span class="py">row</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">LOWER</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">alice</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Efficient</span><span class="p">:</span><span class="w"> </span><span class="nc">store</span><span class="w"> </span><span class="py">lowercase</span><span class="w"> </span><span class="py">version</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_name_lower</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">LOWER</span><span class="p">(</span><span class="py">name</span><span class="p">))</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name_lower</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">LOWER</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Compute</span><span class="w"> </span><span class="kd">on</span><span class="py">ce</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">insert</span><span class="err">/</span><span class="py">update</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="best-practices" class="position-relative d-flex align-items-center group">
<span>Best Practices</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="best-practices"
aria-haspopup="dialog"
aria-label="Share link: Best Practices">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ol>
<li>
<p><strong>Always Normalize</strong>: Normalize text to NFC on insertion for consistent storage and comparison.</p>
</li>
<li>
<p><strong>Choose Appropriate Collation</strong>: Use locale-specific collation for sorting user-visible lists.</p>
</li>
<li>
<p><strong>Index Normalized Values</strong>: Create indexes on normalized text for efficient searches.</p>
</li>
<li>
<p><strong>Validate Input</strong>: Use Unicode-aware validation for emails, URLs, and other constrained fields.</p>
</li>
<li>
<p><strong>Store Language Metadata</strong>: Track the language/locale of multilingual content for proper processing.</p>
</li>
<li>
<p><strong>Test with Real Data</strong>: Use realistic multilingual test data including RTL text, emoji, and complex scripts.</p>
</li>
<li>
<p><strong>Consider Locale in Application Logic</strong>: Make locale selection user-configurable for formatting and sorting.</p>
</li>
</ol>
<h3 id="common-use-cases" class="position-relative d-flex align-items-center group">
<span>Common Use Cases</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="common-use-cases"
aria-haspopup="dialog"
aria-label="Share link: Common Use Cases">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p><strong>Multilingual E-Commerce</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">category_en</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">Electronics</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name_en</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name_es</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name_zh</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">price</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name_en</span><span class="w"> </span><span class="py">COLLATE</span><span class="w"> </span><span class="err">'</span><span class="py">en_US</span><span class="err">';</span><span class="w">
</span></span></span></code></pre></div><p><strong>Global User Profiles</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">username</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">alice</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">display_name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Alice</span><span class="w"> </span><span class="py">Johnson</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">display_name_ja</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">アリス</span><span class="err">・</span><span class="py">ジョンソン</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">bio</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Software</span><span class="w"> </span><span class="py">engineer</span><span class="w"> </span><span class="err">👨</span><span class="py"></span><span class="err">💻</span><span class="w"> </span><span class="py">who</span><span class="w"> </span><span class="py">loves</span><span class="w"> </span><span class="py">databases</span><span class="w"> </span><span class="err">💾'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">preferred_locale</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">en_US</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>International Search</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Search</span><span class="w"> </span><span class="py">across</span><span class="w"> </span><span class="py">languages</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">normalization</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">doc</span><span class="p">:</span><span class="nc">Document</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">NORMALIZE</span><span class="p">(</span><span class="py">LOWER</span><span class="p">(</span><span class="py">doc</span><span class="err">.</span><span class="py">content</span><span class="p">),</span><span class="w"> </span><span class="err">'</span><span class="py">NFC</span><span class="err">'</span><span class="p">)</span><span class="w"> </span><span class="py">CONTAINS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">NORMALIZE</span><span class="p">(</span><span class="py">LOWER</span><span class="p">(</span><span class="nv">$search_query</span><span class="p">),</span><span class="w"> </span><span class="err">'</span><span class="py">NFC</span><span class="err">'</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">doc</span><span class="err">.</span><span class="py">title</span><span class="p">,</span><span class="w"> </span><span class="py">doc</span><span class="err">.</span><span class="py">language</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="related-topics" class="position-relative d-flex align-items-center group">
<span>Related Topics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="related-topics"
aria-haspopup="dialog"
aria-label="Share link: Related Topics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li>Text Processing and String Operations</li>
<li>Full-Text Search and Indexing</li>
<li>Collation Configuration</li>
<li>Data Validation and Constraints</li>
<li>JSON and Semi-Structured Data</li>
<li>Regular Expressions</li>
<li>Client Library Character Encoding</li>
</ul>
<h3 id="further-reading" class="position-relative d-flex align-items-center group">
<span>Further Reading</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="further-reading"
aria-haspopup="dialog"
aria-label="Share link: Further Reading">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li>Unicode Standard Documentation</li>
<li>UTF-8 Encoding Specification</li>
<li>Unicode Normalization Forms (TR15)</li>
<li>Collation Algorithm (UCA)</li>
<li>Locale Data and Cultural Conventions</li>
<li>Emoji and Symbol Support</li>
<li>Internationalization Best Practices</li>
</ul>
Tag
1 article
Unicode Support & Internationalization
Comprehensive guide to Unicode and internationalization in Geode graph database. Learn about UTF-8 encoding, character normalization, collation, multilingual support, and global text handling.